[英]Capturing wildcards in Java generics
从这个 Oracle Java教程:
WildcardError示例在编译时产生捕获错误:
public class WildcardError {
void foo(List<?> i) {
i.set(0, i.get(0));
}
}
在此错误演示之后,他们使用辅助方法解决了问题:
public class WildcardFixed {
void foo(List<?> i) {
fooHelper(i);
}
// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
}
首先,他们说列表输入参数( i
)被视为一个Object
:
在此示例中,编译器将
i
输入参数处理为Object类型。
为什么然后i.get(0)
不返回Object
? 如果已经这样传递了?
此外,当使用<T>
时必须使用辅助方法时,使用<?>
的重点是什么。 直接使用可以推断的T
会不会更好?
List<?>
表示未知类型的对象列表,它与List<Object>
。
因为我们不知道列表中元素的类型,所以i.get(0)
结果被Java视为Object
,并且您不能将Object
添加到List<?>
。 如果你的Java可以更聪明,但是在带有<?>
通配符的更复杂的代码中,很容易使它不安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.