0

考虑以下 Java 代码:

List<? super Number> list = new ArrayList<>();
Number n = new Integer(1);
Object o = new Object();
list.add(n); // works, apparently Number super Number is alright
list.add(o); // compiler error! 

但为什么会这样呢?既然在内部,类型擦除使列表成为一个包含对象的列表,为什么不允许将对象(它们是所有类的超类,因此应该满足下限通配符)添加到列表中?

4

3 回答 3

2

编译器只知道list包含Number(或Number自身)的某些超类型,它可能是也可能不是Object. 所以它必须不允许Object,因为它可能是List<Number>

这是一个更彻底的解释,在它谈论“?超级”的地方向下滚动大约一半。

于 2013-02-22T17:05:38.223 回答
1

一个Object不是一个Number

ANumber是一个Object虽然。

从问题的公认答案来看,这是以下内容的副本:

因此,您可以将 Number 的任何超类型添加到 List 中是不正确的;这根本不是有界通配符和捕获转换的工作方式。您不声明 List 是因为您可能想向其中添加 Object(您不能!);你这样做是因为你想向它添加 Number 对象(即它是 Number 的“消费者”),而且简单的 List 限制性太强。

于 2013-02-22T17:04:21.780 回答
0

List<? super Number> list定义您可以将其分配到的列表。

换句话说,您可以为其分配 aList<Number>或 a List<Object>

Afaiknew ArrayList<>()将与new ArrayList<Number>()

于 2013-02-22T17:07:42.593 回答