泛型将子类添加到数组中

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)

man*_*uti 6

您可能不需要在这里使用泛型.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是编译器不能保证元素的实际类型是AItemBItem.它可能是另一个子类,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)