为什么在填充包含<!-类型的元素的集合时在行为上有所不同?扩展T->?

时间:2018-06-28 18:38:17

标签: java generics jls

在以下代码段中,它在第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

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

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

请澄清。

1 个答案:

答案 0 :(得分:6)

您正在add(?)上呼叫List<?>

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

您的第二个示例未调用任何以?作为参数的方法,因此它并不安全。