JavaSE泛型文档

JavaSE泛型文档,java,generics,terminology,Java,Generics,Terminology,文档在本节的最后一段中指出,add方法的静态类型第二个形式参数是String,但是这个方法是用一个不同类型的实际参数Integer调用的。在l上调用add(int,Object),正如doc所说,哪个静态类型是List。有人能解释一下为什么静态类型是String,而它似乎是Number 谢谢, 乔治 堆污染 链接中的代码为: List l = new ArrayList<Number>(); List<String> ls = l; // unchecked

文档在本节的最后一段中指出,
add方法的静态类型第二个形式参数是String,但是这个方法是用一个不同类型的实际参数Integer调用的。
l
上调用
add(int,Object)
,正如doc所说,哪个静态类型是
List
。有人能解释一下为什么静态类型是
String
,而它似乎是
Number

谢谢, 乔治

堆污染


链接中的代码为:

List l = new ArrayList<Number>();
List<String> ls = l;       // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0);      // ClassCastException is thrown
它定义了一个类型为List的变量,但没有类型,因此编译器(由于java泛型实现)会“丢失”该类型。从该指令中,有关类型的信息丢失,java允许您“几乎做任何事情”。
与任务有关

List<String> ls = l;
它可以是的别名

加(0,新整数(42))


这意味着您正在向字符串数组添加一个整数。链接中的代码是:

List l = new ArrayList<Number>();
List<String> ls = l;       // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0);      // ClassCastException is thrown
它定义了一个类型为List的变量,但没有类型,因此编译器(由于java泛型实现)会“丢失”该类型。从该指令中,有关类型的信息丢失,java允许您“几乎做任何事情”。
与任务有关

List<String> ls = l;
它可以是的别名

加(0,新整数(42))


这意味着您正在向字符串数组添加一个整数

ls的静态类型是
列表
,因为这就是它的定义


使用类型擦除可以更改静态类型。如果操作不正确,您可能会得到“堆污染”。

ls的静态类型是
列表,因为这就是它的定义

使用类型擦除可以更改静态类型。如果这样做不正确,可能会导致“堆污染”