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>());