0

? の新しいインスタンスを作成できるようにしたいと思います。パラメータ化されたタイプですが、それを行う方法が見つかりません。

import java.util.List;
import java.util.Map;
import java.util.Set;


class Pinput {
    public static void parse (String[] args, List<String> params, Map<String, ? extends List<String>> options, Set<String> flags, Set<String> flagSet){

        String optionalParameterKey;
        Boolean isOptionalParameter = false;

        for(int n = 0; n < args.length; ++n){
            String p = args[n];
            if (p.charAt(0) == '-'){
                isOptionalParameter = false;
                if(p.length() > 1){
                    if(p.charAt(1) == '-' || p.length() == 2){

                        if(flagSet.contains(p)){
                            flags.add(p);
                        }
                        else{
                            options.put(p, ?.newInstance());
                            optionalParameterKey = p;
                            isOptionalParameter = true;
                        }
                    }
                    else{
                        for(int i = 1; i < p.length(); ++i){
                            flags.add("" + '-' + p.charAt(i));
                        }
                    }
                }
            }
            else if(isOptionalParameter){
                options.get(optionalParameterKey).add(p);
            }
            else{
                params.add(p);
            }
        }
    }
}

何か案が?

4

1 に答える 1

3

簡単に言えば、それはできません。

.classオブジェクトのオブジェクト、またはオブジェクトを取得できるクラスのインスタンスがある場合にのみ、オブジェクトを反射的にインスタンス化できます。ただし、メソッド シグネチャを次のように変更すると、次のようになります。

public static <T extends List<String>> void parse(String[] args, List<String> params, Map<String, T> options, Set<String> flags, Set<String> flagSet, Class<T> klass)  throws InstantiationException, IllegalAccessException

次に、add MyStringList.class(またはマップ値の型が何であれ) を呼び出すと、コンストラクタ行を次のように変更できます。

options.put(p,  klass.newInstance());

そして、コードは期待どおりに動作するはずです。

編集:

I get this => Test.java:19: illegal start of expression Pinput.parse(args, params, options, flags, flagSet, ArrayList<String>.class);

ArrayList<String>List<String>extends 、ArrayList<T>extends List<T>Stringextendsはありません。Objectこれは、 として有効であることを意味しますT。これは、次のように宣言されたクラスでのみ機能します。

class MyStringList extends List<String>

ジェネリックは、あなたがやろうとしていることにはあまり適していません。実際には、これを署名として使用する必要があります。

public static void parse(String[] args, List<String> params, Map<String, List<String>> options, Set<String> flags, Set<String> flagSet)

リストを次のように手動でインスタンス化しますArrayList

 options.put(arg,  new ArrayList<String>());

Listインターフェイスにすぎないため、コンパイラは、そのインターフェイスの実装を提供し、メソッドへのアクセスのみを許可することを認識していますList

于 2013-09-15T16:16:15.410 に答える