为什么不能将一个Object添加到List <! - ?超级号码 - >?

时间:2013-02-22 17:02:52

标签: java list wildcard type-erasure lower-bound

考虑以下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! 

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

3 个答案:

答案 0 :(得分:1)

Object不是Number

Number虽然是Object

问题的{p> From the accepted answer这是重复的:

  

因此,您可以将任何超类型的数字添加到a中   清单;这根本不是如何有限的通配符和   捕获转换工作。您没有声明列表   因为你可能想要为它添加一个对象(你不能!);你做   因为你想向它添加Number对象(即它是一个“消费者”)   数字),而且只是一个List太严格了。

答案 1 :(得分:1)

编译器只知道list包含一些Number(或Number本身)的超类型,可能是也可能不是Object。因此,它必须禁止Object,因为它可能是List<Number>

这是一个more thorough explanation,在它谈到“?super”的一半左右滚动。

答案 2 :(得分:0)

List<? super Number> list定义您可以分配给它的列表。

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

Afaik new ArrayList<>()new ArrayList<Number>()

相同