Java 填充包含<;类型元素的集合时,为什么会出现行为差异;?扩展T>;?

Java 填充包含<;类型元素的集合时,为什么会出现行为差异;?扩展T>;?,java,generics,jls,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 List您正在调用列表上的添加(?) 由于编译器不知道?是什

在下面的代码段中,它在第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
List您正在调用
列表上的
添加(?)

由于编译器不知道
是什么,因此没有任何可能的值(除了
null
)可以传递,而该值保证对所有可能的
都是合法的

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

您正在调用
列表上的
添加(?)

由于编译器不知道
是什么,因此没有任何可能的值(除了
null
)可以传递,而该值保证对所有可能的
都是合法的


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

列表2初始化后,您不会将其添加到相关的列表中:。将代码更改为
列表1=new ArrayList(),然后添加任何您喜欢的内容。初始化列表2后,您将不会向其添加相关内容:。将代码更改为
List list1=new ArrayList(),然后添加您喜欢的内容。