2009-11-22 14 views
107

HashMap<String, int>似乎並沒有工作,但HashMap<String, Integer>確實工作。 任何想法爲什麼?的java:HashMap的<String, int>不工作

+0

你對你的問題的選擇詞是混淆,你能澄清?確切地說,什麼是不工作的,你可以發佈代碼嗎? – 2009-11-22 23:23:00

+7

@aforloney - 顯然這是一個編譯錯誤。 – 2009-11-23 03:36:40

回答

171

不能使用基本類型作爲Java的泛型參數。改用:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

auto-boxing/unboxing代碼沒有什麼區別。自動裝箱意味着你可以這樣寫:

myMap.put("foo", 3); 

代替:

myMap.put("foo", new Integer(3)); 

自動裝箱是指第一個版本被隱式轉換爲第二。自動拆箱意味着你可以寫:的

int i = myMap.get("foo"); 

代替:

int i = myMap.get("foo").intValue(); 

intValue()的隱式調用意味着,如果關鍵是沒有找到它會產生一個NullPointerException,例如:

int i = myMap.get("bar"); // NullPointerException 

的原因是type erasure。與C#不同,通用類型不會在運行時保留。他們只是「語法糖」爲顯式轉換來拯救你這樣做:

Integer i = (Integer)myMap.get("foo"); 

給你舉一個例子,這個代碼是完全合法:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
Map<Integer, String> map2 = (Map<Integer, String>)myMap; 
map2.put(3, "foo"); 
+3

您的最後一個例子不工作:無法從地圖<字符串,整數>投地圖<整數,字符串> – T3rm1 2013-06-24 08:16:51

+0

爲什麼它不'Float'和'Double'工作? – 2015-02-25 16:25:30

+0

考慮到新行中的每個單獨的代碼,第5行中的代碼在使用intValue()方法之前必須首先轉換爲Integer,因爲在使用get()方法時將其視爲對象。 – 2016-03-31 09:50:37

-2

可以在通用的參數,而不是原始類型使用引用類型。 所以在這裏,你應該使用

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

和存儲值

myMap.put("abc", 5); 
+1

這不回答問題 – smac89 2016-05-20 02:25:22

+0

@ Smac89我不認爲這正確地回答了這個問題,但它是一個答案。所以要正確處理這個問題就是降低投票率,而不是標記。 – 2016-05-20 02:44:19

2

HashMap不能使用基本類型。 intdouble不起作用。你必須使用它的封閉類型。舉例

Map<String,Integer> m = new HashMap<String,Integer>(); 

現在這兩個都是對象,所以這將工作。

相關問題