考虑以下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!
但为什么会这样呢?从内部开始,类型擦除使列表成为一个包含对象的列表,为什么不允许在列表中添加对象(它们是所有类的超类,从而应该满足下限通配符)?
答案 0 :(得分:1)
Object
不是Number
。
Number
虽然是Object
。
因此,您可以将任何超类型的数字添加到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>()