文档在本节的最后一段中说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
。
谢谢, 乔治
堆污染
答案 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>
使用类型擦除可以更改静态类型。如果操作不正确,您可能会受到“堆污染”。