可能重复:
为什么这个通用的Java代码无法编译?
给出以下代码:
import java.util.Collections;
import java.util.List;
public class ComeGetSome {
//TODO: private final Some<?> some = new Some();
private final Some some = new Some();
public static void main(String[] args) {
new ComeGetSome().dude();
}
public void dude() {
for (String str : some.getSomeStrings()) { //FIXME: does not compile!
System.out.println(str);
}
}
}
class Some<T> {
public List<String> getSomeStrings() {
return Collections.<String> emptyList();
}
}
它不会编译,因为会some.getSomeStrings()
返回raw List
。但是方法签名指定它返回一个List<String>
!
它以某种方式与Some
具有类型声明但被引用为原始类型的事实有关。使用参考来Some<?>
解决此问题。但是该方法与类的类型声明无关!
编译器为什么会这样?
如果你使用泛型类的原料(无类型)的实例,那么它被视为是完全生的,即所有泛型类型的信息被忽略,即使被忽略的类型是不相关的已省略了泛型类型。
这就是为什么
private final Some<?> some = new Some();
...修复了错误-它使用(虽然是通配符)的类型化版本Some
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句