在子类中丢失的通用类型的超类属性,没有类型绑定

时间:2018-04-23 19:01:05

标签: 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 = 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???");
    }
}

为什么这是编译器错误?

1 个答案:

答案 0 :(得分:-2)

您致电setStuff(new ArrayList<>());。这里ArrayList&lt;&gt;不受约束,它是由编译器推断的,如果可以的话。它可以setStuff setStuff(List<String>)。所以编译器知道它是ArrayList<String>并使用(推断)它。

您的循环迭代List<String>方法返回的getStuff(),因此将thing定义为String(或任何超类或接口)都可以对于编译器。

基类确实有X类型,但无关紧要,因为你的东西列表是用类型声明的。只有当你将东西定义为List<X>时,为X定义的子类才有意义。