这是Java中的病态泛型示例。这是怎么回事?
public abstract class Foo<X> {
private List<String> stuff;
public List<String> getStuff() {
return stuff;
}
public void setStuff(List<String> stuff) {
this.stuff = stuff;
}
}
然后我创建了一个子类,但是我没有指定类型绑定,这应该使它成为对象。
public class Bar extends Foo {
public Bar() {
setStuff(new ArrayList<>());
}
public void whatIsGoingOnHere() {
for(String thing : getStuff())
System.out.println("Why is this a compiler error???");
}
}
为什么这是编译器错误?
答案 0 :(得分:-2)
您致电setStuff(new ArrayList<>());
。这里ArrayList&lt;&gt;不受约束,它是由编译器推断的,如果可以的话。它可以setStuff
setStuff(List<String>)
。所以编译器知道它是ArrayList<String>
并使用(推断)它。
您的循环迭代List<String>
方法返回的getStuff()
,因此将thing
定义为String
(或任何超类或接口)都可以对于编译器。
基类确实有X
类型,但无关紧要,因为你的东西列表是用类型声明的。只有当你将东西定义为List<X>
时,为X
定义的子类才有意义。