为什么填充包含<?类型元素的集合时的行为差异?延伸T>?

Omk*_*kar 0 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
Run Code Online (Sandbox Code Playgroud)

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

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

请澄清.

SLa*_*aks 6

你正在呼唤add(?)一个List<?>.

由于编译器不知道它?是什么,因此没有可能的值(除了null),你可以传递,保证每个可能的合法?.

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