Java 在没有类型绑定的子类中丢失了超类属性的泛型类型

Java 在没有类型绑定的子类中丢失了超类属性的泛型类型,java,generics,Java,Generics,下面是Java中的病理泛型示例。这是怎么回事 public abstract class Foo<X> { private List<String> stuff; public List<String> getStuff() { return stuff; } public void setStuff(List<String> stuff) { this.stuff = stuf

下面是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;
    }
}
公共抽象类Foo{
私人物品清单;
公共列表getStuff(){
归还物品;
}
公共空集凝灰岩(列表材料){
this.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???");
    }
}

公共类栏扩展了Foo{
公共酒吧(){
setStuff(新的ArrayList());
}
公共无效Whatisgingohere(){
for(字符串内容:getStuff())
System.out.println(“为什么这是一个编译器错误?”);
}
}
为什么这是一个编译器错误?

您调用
setStuff(newarraylist())。这里ArrayList没有绑定,如果可以的话,编译器会推断它。它可以是
setStuff
is
setStuff(列表)
。因此编译器知道它是一个
ArrayList
,并使用(推断)它

循环在
getStuff()
方法返回的
列表
上迭代,因此编译器可以将
对象
定义为
字符串
(或任何超类或接口)


基类确实有一个
X
类型,但这并不重要,因为您的填充列表是用一个类型声明的。只有将stuff定义为一个
列表
时,为
X

公共类栏扩展的子类才有意义。Foo
修复了这个问题?请参阅:原始类型删除所有泛型,而不仅仅是与省略的类型变量相关的泛型。您需要
扩展Foo