作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够创建 ? 的新实例。参数化类型,但我找不到方法。
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);
}
}
}
}
有什么想法吗?
最佳答案
简单地说:你不能这样做。
如果您有.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
然后当你调用它时添加 MyStringList.class
(或者无论 map 值类型是什么),您可以将构造函数行更改为:
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
只是一个接口(interface),编译器知道您将提供该接口(interface)的一些实现,然后只允许您访问 List
方法。
关于java - 泛型类型参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18814480/
我是一名优秀的程序员,十分优秀!