我有 3 个简单的类,如下所示:
public class ElementA {}
public class ElementB extends ElementA {}
public class ElementC extends ElementB {}
然后,例如,如果我想创建仅采用 ElementA 类的子类的通用列表,我可以将其声明为:
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>
为什么会这样?
最佳答案
问题在于 ?
的值在运行时是未知的。您必须替换具体的类/接口(interface)才能执行您想要的操作。
如果你这样做:
List<ElementA> list = new ArrayList<ElementA>();
从ElementB
开始你就很好了是 ElementA
同时。相同代表 ElementC
。
List<? extends ElementA>
例如,如果您在类中声明它,并且在子类中您可以替换具体的东西作为类型参数,那么这是有意义的。笨拙的例子:
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);
}
}
关于java - Java中的泛型类型——高级多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19184862/