gpt4 book ai didi

java - Java 中的泛型类型——高级多态性

转载 作者:行者123 更新时间:2023-11-30 07:13:44 24 4
gpt4 key购买 nike

我有 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>

为什么会这样?

最佳答案

问题是 ? 的值在运行时是未知的。您必须替换一个具体的类/接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com