Java &引用;?“扩展父类”;是只读的吗?

Java &引用;?“扩展父类”;是只读的吗?,java,generics,null,generic-list,readonly-collection,Java,Generics,Null,Generic List,Readonly Collection,在下面的Java代码中,我创建了一个列表nums。我可以在声明期间分配另一个列表。但是除了null之外,不能添加新项目。那么,这是否意味着nums是只读的为什么?是否可以在该列表中添加新项目 List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<? extends Number> nums = ints; nums.add(3.14); //Generate

在下面的Java代码中,我创建了一个列表
nums
。我可以在声明期间分配另一个列表。但是除了
null
之外,不能添加新项目。那么,这是否意味着
nums
是只读的为什么?是否可以在该列表中添加新项目

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);

List<? extends Number> nums = ints;
nums.add(3.14); //Generates error
nums.addAll(ints);  //Generates error

nums.add(null);     //works
System.out.println(nums.get(0));    //works
List ints=new ArrayList();
加入(1);
内加(2);
列表
是否可以在该列表中添加新项目

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);

List<? extends Number> nums = ints;
nums.add(3.14); //Generates error
nums.addAll(ints);  //Generates error

nums.add(null);     //works
System.out.println(nums.get(0));    //works
没有。。。因为代码不知道它实际上是一个列表。想象一下,如果你能:

List strings=new ArrayList();

List泛型仅在编译时使用

所以编译器将决定我们要使用的实际类型

List<? extends Number>

List不,它不是只读的。。。尽管这是典型的意图


给定一个
列表当你想到
列表我不知道时,它会很有帮助,注意nums.add((Number)new Double(3.14));错误的结果:类型列表中的add(capture#1-of?extends Number)方法不适用于参数(Number)。请看这个问题:这是一个非常常见的误解;但是这个概念在大多数情况下是有效的:)请参考以获得更多的理解。@PradipKharbuja:不,不完全是。列表本身不是只读的-您仍然可以通过
ints
添加到列表中,或者通过
nums
从列表中删除。由于类型安全,您无法添加到
nums