2010-09-03 299 views

回答

9

這是因爲在Java泛型是不變,即即使B類是A,一個Collection<B>一個Collection<A>

這是一個很好的理由。如果你的例子是合法的,這將是可能的:

Map<String, HashMap<String, Boolean>> myHashMap = new HashMap<String,HashMap<String,Boolean>>(); 
Map<String, Map<String, Boolean>> myMap = myHashMap; 
myMap.put("oops", new TreeMap<String, Boolean>()); 
HashMap<String, Boolean> aHashMap = myMap.get("oops"); // oops - ClassCastException! 
+0

但是,鑑於myMap的聲明,只要它們實現Map接口,我會關心哪種地圖放置在那裏? – extraneon 2010-09-03 14:52:19

+0

@extraneon:在這種情況下,請參閱鮑里斯的答案。 – Powerlord 2010-09-03 14:56:00

+0

@extraneon,看我更新的例子。 – 2010-09-03 14:57:41

-1

我認爲這是因爲Map<String, Boolean>HashMap<String,Boolean>之間的差異。 的確,泛型在這裏是一個規範,兩邊必須是相同的。 (或者至少這是我的看法)。

5

在第二種情況下,myMap是密鑰類型爲String,值爲Map<String, Boolean>類型的映射。 HashMap<String, Boolean>不是Map<String, Boolean>它實現它。因此,這將編譯:

Map<String, ? extends Map<String, Boolean>> myOtherMap = 
    new HashMap<String,HashMap<String,Boolean>>(); 
+1

HashMap 是一個Map 。 – 2010-09-03 17:00:28

+0

裏基的權利,使用「是一個」是不幸的(因爲HashMap是一個地圖)。基本上使用'? extends'放寬Generic的類型要求,從完全匹配到繼承層次匹配。 – idbrii 2011-01-13 17:26:37

相關問題