2010-11-03 79 views
4

下面的代碼編譯沒有錯誤......這一次我更希望它失敗:/Java泛型非問題在編譯時

Map <Character, Double> m = new HashMap <Character, Double>(); 
    m.get(new String()); 

由於編譯器知道在這個地圖中使用的主要是字符類型,使用字符串鍵應該被標記爲不正確。

我缺少什麼?

回答

11

你不會錯過任何東西。所有Map#get()調用只需要Object

根據實施,你可能會看到一個(運行時)ClassCastException當你傳遞一個StringMap<Character, Double>#get()


Here's why Map#get() isn't fully generic

+0

是的,這是正確的。字符串是一個對象:)我的IDE確實會發出警告 – 2010-11-03 14:08:21

+1

我認爲這樣做的目的是保存遺留代碼。糾正我,如果我錯了。 – Jeremy 2010-11-03 14:09:52

+0

完全正確(+1),儘管它是可怕的... – 2010-11-03 14:12:01

1

如果您嘗試運行此代碼,則缺少(可選)運行時異常(ClassCastException)。

1

該方法得到沒有參數化與泛型參數只有結果是。

你也可以做

m.get(1L); //m.get(Object o); 

的參數化方法把

m.put(new String(), 0.0); //Fail 

//The method put(Character, Double) in the type Map<Character,Double> is not applicable for the arguments (String, double) 

m.put(new Character('c'), 0.0); //Ok 
0

get檢索對象的參數是.equals()。一個對象可能是.equals()到另一個類的對象。