我有3个简单的类,如下所示:

public class ElementA {}
public class ElementB extends ElementA {}
public class ElementC extends ElementB {}


然后,如果我想创建例如仅包含ElementA类的子类的泛型List,则可以将其声明为:

List<? super ElementA> list = new ArrayList<>();


然后按如下方式使用它:

list.add(new ElementA());
list.add(new ElementB());
list.add(new ElementC());


很好,可以编译而不会出错。但是,如果我想存储除ElementC或ElementB或ElementA以外的任何内容,我会感到困惑。我声明这样的列表如下:

List<? extends ElementC> list = new ArrayList<>();


而且我根本无法使用它,因为它只能存储空值。当我将List声明为(注意,我正在使用位于“家庭中间”的类)时,会发生相同的事情:

List<? extends ElementB>


为什么这样?

最佳答案

问题是?的值在运行时未知。您必须替换具体的类/接口才能执行所需的操作。

如果您这样做:

List<ElementA> list = new ArrayList<ElementA>();


您很好,因为ElementB同时是ElementA。相同代表ElementC

例如,如果您在类中声明List<? extends ElementA>并在子类中声明它,则可以将某些具体内容替换为type参数。笨拙的例子:

public class SomeClass<T> {
    private List<? extends T> list;

    public void setList(List<? extends T> list) {
        this.list = list;
    }
}

public class SomeConcreteClass extends SomeClass<Integer> {

    public void doSomething() {
        List<Integer> list = new ArrayList<Integer>();
        setList(list);
    }
}

10-04 11:59