繁体   English   中英

通用通配符协方差和arraylist添加函数行为

[英]generic wild card covariance and arraylist add function behaviour

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> List<? super EquilateralTriangle>是声明,使用new ArrayList<Triangle>告诉编译器一些具体的信息,我的arraylist是三角形类型。 那为什么编译器在第二行抱怨呢? 我要在实例化arraylist时插入与在定义的type参数中定义的值相同的值。

Java arraylist定义说明了这一点:

class ArrayList<E> extends AbstractList<E>

public ArrayList(Collection<? extends E> c)

boolean add(E e); 对于ArrayList

因此,类型E可以推断为Triangle 然后add一定不要抱怨,因为我像在ArrayList构造函数中那样传递了Triangle 我的理解中缺少什么?

看一下以下语句。 显然,添加字符串是可行的,而添加对象会导致编译时错误。

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

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

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

在此变量声明中, ? 代表未知数型 ,要么是字符串或基类字符串 无法推断/推断类型。 这只是一个未知类型 编译器必须假设,即? super String ? super String可以是String 正如我们在上面看到的,不应将Objects添加到Strings列表中。

nosid的答案解释了方差部分。 我将解决这个问题:

为什么编译器在第二行抱怨? 我要在实例化arraylist时插入与在定义的type参数中定义的值相同的值。

我可以问您有关此代码的相同问题:

Object object = new ArrayList<Triangle>();
object.add(new Triangle());

为什么不起作用? 编译器是否不知道该objectArrayList<Triangle>

答案是不。 编译器实例化什么类型都无关紧要。 重要的是调用add变量的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM