Oli*_*ins 3 java generics inheritance
我有一个扩展A的B级.一个商店的列表AItem和乙商店名单BItem
在"A"我有一个ArrayList的,它使用[ ?扩展AItem ].
我认为这意味着我可以将此ArrayList用于任何扩展AItem的类型的对象.
所以在我的B类中,我有一个方法add(..),它为项添加了一个BItem.
我认为这样可行,因为itemsList可以保存从AItem扩展的任何对象的列表.
import java.util.ArrayList;
class A {
public ArrayList<? extends AItem> items;
}
public class B extends A{
public void add(BItem i) {
this.items.add(i); //compile error here
}
}
//items :
class AItem {}
class BItem extends AItem{}
Run Code Online (Sandbox Code Playgroud)
我怎么能让这个工作?
我的编译错误如下所示:
方法add(捕获#2-of?extends AItem)在ArrayList类型中不适用于参数(BItem)
您可能不需要在这里使用泛型.AItem在类中列出类型A应该没问题(我也会声明它是类型List而不是ArrayList最佳实践):
class A {
public List<AItem> items;
}
class B extends A {
public void add(BItem i) {
this.items.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
问题? extends AItem是编译器不能保证元素的实际类型是AItem或BItem.它可能是另一个子类,CItem在这种情况下类型安全性被打破.
这里是另一种方法来设计类层次结构与仿制药,在其中设置的类型参数在父类中,并将其设置到适当的子类(BItem)的扩展类B:
class A<T extends AItem> {
public ArrayList<T> items;
}
class B extends A<BItem>{
public void add(BItem i) {
this.items.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)