Java SE泛型文档

时间:2011-11-25 13:11:50

标签: java generics terminology

Heap Pollution

文档在本节的最后一段中说The static type second formal parameter of the add method is String, but this method is called with an actual parameter of a different type, Integer. add(int,Object)l上调用,静态类型为List<Number>,如doc所述。有人可以解释为什么静态类型String似乎是Number

谢谢, 乔治

  

堆污染

2 个答案:

答案 0 :(得分:3)

链接中的代码是:

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 l

它定义了一个List类型的变量但是没有类型,所以编译器(由于java泛型实现)“丢失”了这个类型。根据该指令,有关类型的信息将丢失,java允许您“几乎任何事情” 通过作业

List<String> ls = l;

你创建一个ls作为字符串数组,所以当它调用

l.add(0, new Integer(42));

它可以作为

的别名

ls.add(0,new Integer(42));

这意味着您要将一个Integer添加到一个字符串数组

答案 1 :(得分:1)

ls的静态类型为List<String>,因为它被定义为。{/ p>

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