我有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);
}
}