【问题标题】:Why difference in behavior while populating collection containing elements of type <? extends T>? [duplicate]为什么在填充包含 < 类型元素的集合时行为会有所不同?扩展 T>? [复制]
【发布时间】:2018-06-28 18:38:16
【问题描述】:

在下面的代码 sn-p 中,它在第 2 行给出编译错误,但在第 3 行没有。

List<? extends Object> list1 = new ArrayList<>(); // line 1
list1.add("123"); // line 2

List<? extends Object> list2 = Arrays.asList("123", new Integer(12)); // line 3

如果语言设计者已经决定,不允许将元素添加到元素类型 &lt;? extends T&gt; 的集合中,那么它也应该适用于第 3 行。

造成这种差异的原因可能是什么?

请澄清。

【问题讨论】:

标签: java generics jls


【解决方案1】:

您正在通过List&lt;?&gt; 呼叫add(?)

由于编译器不知道? 是什么,因此您可以传递的任何值(null 除外)都不能保证对于每个可能的? 都是合法的。

您的第二个示例没有调用任何将? 作为参数的方法,因此它不是不安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2011-03-28
    相关资源
    最近更新 更多