来自this 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
会不会更好?
答案 0 :(得分:4)
List<?>
表示未知类型的对象列表,它与List<Object>
不同。
因为我们不知道列表中i.get(0)
的结果中的元素类型被Java视为Object
,并且您无法将Object
添加到List<?>
。如果您的Java可以更聪明,但在使用<?>
通配符的更复杂的代码中,很容易使它不安全。