2013-02-22 51 views
-1

考虑下面的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

这个确切的例子是,即使在这个问题...... – Woot4Moo 2013-02-22 17:05:29

回答

1

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

这里是一个more thorough explanation,滚动大约一半的地方,它谈论“超级”。

+0

感谢使用,想多一点和阅读的链接之后,我知道了。 – Tilde 2013-02-22 17:39:02

+0

@downvoter:downvote的原因是什么? – rgettman 2013-02-22 18:07:54

1

Object不是Number

A Number虽然是Object

这个问题的From the accepted answer是一个重复:

因此,它是不正确的,你可以数的任何超类型添加到列表 ;这根本不是如何限制通配符和捕获转换的工作。你不要声明一个列表 因为你可能想要添加一个对象(你不能!);你做 ,因为你想添加Number对象(即它是Number的“消费者” ),并且List只是太限制了。

0

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

换句话说,你可以指定一个List<Number>List<Object>它。

据我所知new ArrayList<>()将是相同new ArrayList<Number>()

相关问题