2011-11-25 52 views
1

Heap Pollution的Java SE泛型文檔

文件說,在這一節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>作爲醫生說的最後一段。有人能解釋爲什麼靜態類型是String,看起來是Number

感謝, 喬治

堆污染

回答

1

靜態類型的lsList<String>因爲這是它被定義爲一個陣列。

使用類型擦除允許您更改靜態類型。當這種做法不正確時,你可能會「堆積污染」。

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,新的整數的別名分配(42));

它意味着要添加的整數字符串