Java 泛型类型参数构造函数

Java 泛型类型参数构造函数,java,generics,type-parameter,Java,Generics,Type Parameter,我希望能够创建的新实例?参数化类型,但我找不到一种方法来实现它 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&l

我希望能够创建的新实例?参数化类型,但我找不到一种方法来实现它

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);
            }
        }
    }
}
import java.util.List;
导入java.util.Map;
导入java.util.Set;
类Pinput{
公共静态无效解析(字符串[]参数、列表参数、映射选项、设置标志、设置标志集){
字符串可选参数键;
布尔等位参数=false;
对于(int n=0;n1){
如果(p.charAt(1)='-'| | p.length()==2){
if(flagSet.contains(p)){
添加(p);
}
否则{
options.put(p,?newInstance());
optionalParameterKey=p;
等时参数=真;
}
}
否则{
对于(int i=1;i

有什么想法吗?

简单地说:你不能那样做

如果对象具有
.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
您的代码应该按预期工作

编辑:

I get this=>Test.java:19:表达式的非法开始
parse(参数、参数、选项、标志、标志集、,
ArrayList.class)

ArrayList
不扩展
List
ArrayList
扩展
List
String
扩展
对象
,这意味着它作为
T
有效。这仅适用于声明为:

class MyStringList extends List<String>

由于
List
只是一个接口,编译器知道您将提供该接口的一些实现,然后只允许您访问
List
方法。

简单地说:您不能这样做

如果对象具有
.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
您的代码应该按预期工作

编辑:

I get this=>Test.java:19:表达式的非法开始
parse(参数、参数、选项、标志、标志集、,
ArrayList.class)

ArrayList
不扩展
List
ArrayList
扩展
List
String
扩展
对象
,这意味着它作为
T
有效。这仅适用于声明为:

class MyStringList extends List<String>

由于
List
只是一个接口,编译器知道您将提供该接口的一些实现,然后只允许您访问
List
方法。

简而言之,您不能。类型擦除会清除类型信息,因此在运行时不可用。关于限制的更多信息。开始学习@kiheru,那么对于这种情况,您建议什么解决方案作为变通方法?哪种变通方法是正确的取决于具体情况。@MrLore发布的可能是静态方法的最佳选择。简而言之,你不能。类型擦除会清除类型信息,因此在运行时不可用。关于限制的更多信息。开始学习@kiheru,那么对于这种情况,您建议什么解决方案作为变通方法?哪种变通方法是正确的取决于具体情况。@MrLore发布的可能是最适合静态方法的;当然,我错过了接口的全部要点。非常感谢。唯一困扰我的是,用户将无法选择List的底层实现…我得到这个=>Test.java:19:表达式Pinput.parse的非法开始(args、params、options、flags、flagSet、ArrayList.class);当然,我错过了接口的全部要点。非常感谢。唯一困扰我的是,用户将无法选择列表的底层实现。。。
 options.put(arg,  new ArrayList<String>());