gpt4 book ai didi

java - 通用通配符协方差和数组列表添加函数行为

转载 作者:行者123 更新时间:2023-11-30 11:20:46 25 4
gpt4 key购买 nike

EquilateralTriangleTriangle 的子类型.

List<? super EquilateralTriangle> equilateralTriangle =
new ArrayList<Triangle>(Arrays.asList(new Triangle(), new Triangle()));
equilateralTriangle.add(new Triangle()); // doesn't work
equilateralTriangle.add(new EquilateralTriangle()); // works

据我所知List<? super EquilateralTriangle>是声明和 new ArrayList<Triangle>我们告诉编译器一些具体的事情,我的 arraylist 是三角形类型。那为什么编译器会在第二行提示呢?我插入的值与我在实例化 arraylist 时定义的类型参数中定义的值相同。

Java arraylist 定义是这样说的:

class ArrayList<E> extends AbstractList<E>

public ArrayList(Collection<? extends E> c)

boolean add(E e);对于 ArrayList .

因此,类型 E可以推断为Triangle .那么add一定不要提示,因为我正在通过 Triangle正如我在 ArrayList 中所做的那样构造函数。我的理解中缺少什么?

最佳答案

看看下面的语句。显然,添加 String 是可行的,而添加 Object 会导致编译时错误。

List<String> items = ...;
items.add(new String()); // works
items.add(new Object()); // error

现在,让我们在您的问题中使用通配符:

List<? super String> items = ...;

在此变量声明中,? 代表一个未知类型,即StringString 的基类。不推导/推断类型。它只是一个未知类型。编译器必须假设 ? super String 可以是 String。正如我们在上面看到的,您不应该将 Objects 添加到 Strings 列表中。

关于java - 通用通配符协方差和数组列表添加函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22578404/

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