2010-09-03 259 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

相关问题