java通配符中的泛型 List ints=new ArrayList(); 加入(1);内加(2); 这是因为java泛型中的类型擦除。 无法向ListList添加新元素,因为其类型参数在编译时未定义。 listlist

java通配符中的泛型 List ints=new ArrayList(); 加入(1);内加(2); 这是因为java泛型中的类型擦除。 无法向ListList添加新元素,因为其类型参数在编译时未定义。 listlist,java,Java,list我认为这里的重要部分是实例化(newarraylist()),它清楚地将Integer传递给list类。左手边的菱形符号并不重要,只要它是兼容的。由于您后来将泛型定义为整数的上限,主要是数字及其子类型,因此Java对此没有问题,因为它仍然可以处理整数。对象本质上仍然是一个列表 这类似于将字符串指定给对象。它将起作用,因为对象是字符串的超类型。这里的列表参见:另外:我认为说nums在某种程度上仍然是一个整数列表有点不准确。不仅不能添加浮点,甚至不能将整数添加到nums列表中nums.add

list我认为这里的重要部分是实例化(
newarraylist()
),它清楚地将
Integer
传递给list类。左手边的菱形符号并不重要,只要它是兼容的。由于您后来将泛型定义为
整数
的上限,主要是
数字
及其子类型,因此Java对此没有问题,因为它仍然可以处理整数。对象本质上仍然是一个
列表


这类似于将字符串指定给对象。它将起作用,因为
对象
字符串
的超类型。这里的
列表参见:另外:我认为说
nums
在某种程度上仍然是一个整数列表有点不准确。不仅不能添加浮点,甚至不能将整数添加到
nums
列表中
nums.add(新整数(1))
仍然不会编译。同意@jrook。。。在发生错误的地方,编译器只知道
nums
是一个
列表,我看到使用了“超类”,所以如果“超类型”是错误的,那么它就没有那么大的错误。
List<Integer> ints = new ArrayList<Integer>();
 ints.add(1); ints.add(2);
 List<? extends Number> nums = ints;
 nums.add(3.14);   // compile-time error
assertints.toString().equals("[1, 2, 3.14]");
List<Integer> ints = new ArrayList<Integer>();
ints.add(1); ints.add(2);
List<? extends Number> nums = ints;
nums.add(3.14);
Integer third = ints.get(2);