2014-06-06 26 views
0

我有三行代碼:java的:錯誤而創建集合API對象

1) List<String> list = new ArrayList<String>(); 

不產生任何錯誤
但是當我寫下面的代碼行

2)Map<String, List<String>> map = new HashMap<String, ArrayList<String>>(); 

我獲得以下錯誤
類型不匹配:無法從HashMap<String,ArrayList<String>> to Map<String,List<String>>轉換

3)Map<String,String> d= new HashMap<String,String>(); 

爲什麼
(2)行顯示我錯誤此行不會產生任何錯誤

我想知道。 在此提前致謝。:)

回答

6

這是一個非正式的答案。有了這個代碼:

Map<String, List<String>> map = new HashMap<String, ArrayList<String>>(); 

你會最終有一個map,其值可以是任何List<String>,這意味着你可以這樣做:

map.put("test", new LinkedList<String>()); 

,這是不正確的,因爲一個LinkedList不一個ArrayList。 Java編譯器正在努力在編譯時提供類型安全性,這就是它產生錯誤的原因。

+3

+1很好的解釋 –

+0

** **混淆如果你問我的解釋。他從未說過他想要一個只接受ArrayLists值的Map。那會是什麼意思?他更可能想要一個接受任何列表作爲值的Map,但他在實例化它時遇到了麻煩。 –

+0

@AlvinThompson真的,但他創建了一個只接受ArrayList作爲值的HashMap,因此是問題所在。如果您有任何建議,我很樂意爲此改進措辭。 – jdigital

2

Map變量(<String, List<String>>,左側)的聲明類型必須與您嘗試分配給它的類型(右側)匹配。由於類型不匹配,這是一個類似的錯誤,如果你試着寫:

Map<String,String> d= new HashMap<Integer,String>(); // Types don't match! 

相反,請確保所創建的類型匹配,就像這樣:

Map<String, List<String>> map = new HashMap<String, List<String>>(); 

然後,您可以添加的ArrayList根據需要(或任何類型的列表的)作爲地圖值:

List<String> list = new ArrayList<String>(); 
map.put("foo", list); 

或跳過的變量:

map.put("foo", new ArrayList<String>()); 
0

你可以使用這個 -

HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
+0

關閉,但不需要將左值設爲HashMap。看到我的答案。 –