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>ArrayList<T>扩展List<T>String扩展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 回答