4

我有以下代码:

List<? super Integer> numbers = new ArrayList<Number>();
numbers.add(new Integer(10));
Number object = numbers.get(0);  //this doesn't compile??

Object object = numbers.get(0);  //this does compile

然后,如果我这样做:

numbers.add(new Object()); //doesn't compile in contradiction to above statement

这是什么原因?

4

4 回答 4

9

Number object不起作用,因为编译器不知道这numbersNumbers 的列表 - 它只知道它是Integer. 例如,它可能是一个Objects 列表,在这种情况下,将结果存储getNumber变量中是行不通的。因此编译器不允许这样做。

Object object是允许的,因为将结果存储getObject变量中总是有效的,因为您可以将任何内容存储在Object变量中。

numbers.add( new Object() )不起作用的原因是您只允许将Objects 添加到List<Object>s,但numbers很可能是 aList<Integer>或 a List<Number>(实际上是后者),所以这是不允许的。

基本上你必须这样想:numbers可能是一个Integers 列表、一个Numbers 列表或一个 s 列表Object,所以你只能执行那些对这三个中的任何一个都有效的操作。

于 2013-04-12T15:49:39.133 回答
4

List<? super Integer>允许numbers成为 的列表Objects,而不仅仅是 的列表Numbers或列表Integers

List<? super Integer> numbers = new ArrayList<Object>();

纯粹基于 的编译时类型numbers,不能保证以下是类型安全的,因此被拒绝:

Number object = numbers.get(0);  //this doesn't compile
于 2013-04-12T15:49:13.310 回答
1

通过声明List<? super Integer>,您是说它可以接受任何作为超类的对象,Integer其中也包括Numberand ObjectNumber因此,您可以在该列表中添加and的实例,Object以便在从列表中检索最通用的类​​型 ie 时Object考虑。

于 2013-04-12T15:54:06.520 回答
-1

我认为您正在寻找使用任何 SUPER 整数类加载列表。Object 是唯一的 Super 的 Integer 类。

Number 是一个 Object,因此它是合法的new ArrayList<Number>()

但是当你尝试从 numbersList 中获取时,它只能是一个 Object。因为 Object 是 Integer 的唯一 Super 类。

如果您有任何疑问,或者您认为我需要纠正我的理解,请告诉我。

问候, 维诺德

于 2013-04-12T15:59:27.280 回答