【问题标题】:Why can't one add an Object to List<? super Number>? [duplicate]为什么不能将对象添加到 List<?超号>? [复制]
【发布时间】:2013-02-22 17:02:51
【问题描述】:

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

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

【问题讨论】:

  • 这个确切的例子甚至被用在那个问题中......

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


【解决方案1】:

编译器只知道list 包含Number 的某些超类型(或Number 本身),它可能是也可能不是Object。所以它必须禁止Object,因为它可能是List&lt;Number&gt;

这是一个more thorough explanation,向下滚动大约一半,其中提到“?超级”。

【讨论】:

  • 谢谢,想了想又看了链接,我明白了。
  • @downvoter:投反对票的原因是什么?
【解决方案2】:

Object 不是Number

NumberObject

From the accepted answer 的问题是重复的:

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

【讨论】:

    【解决方案3】:

    List&lt;? super Number&gt; list 定义了您可以将其分配到的列表。

    换句话说,您可以为其分配List&lt;Number&gt;List&lt;Object&gt;

    Afaik new ArrayList&lt;&gt;()new ArrayList&lt;Number&gt;() 相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多