Java 在没有类型绑定的子类中丢失了超类属性的泛型类型
下面是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
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
issetStuff(列表)
。因此编译器知道它是一个ArrayList
,并使用(推断)它
循环在getStuff()
方法返回的列表
上迭代,因此编译器可以将对象
定义为字符串
(或任何超类或接口)
基类确实有一个X
类型,但这并不重要,因为您的填充列表是用一个类型声明的。只有将stuff定义为一个列表
时,为X
公共类栏扩展的子类才有意义。Foo
修复了这个问题?请参阅:原始类型删除所有泛型,而不仅仅是与省略的类型变量相关的泛型。您需要扩展Foo
。