Map > myMap = new HashMap >();
为什么没有在Java中的工作,但是这确实Map <String,Map <String,Boolean >> myMap = new HashMap <String,HashMap <String,Boolean >>();
Map<String, Map<String, Boolean>> myMap = new HashMap<String,Map<String,Boolean>>();
只是为了澄清嵌套HashMap中的以下变化显示了一个编译器错误,而上面没有没有;与地图(不HashMap的)
Map<String, Map<String, Boolean>> myMap = new HashMap<String,HashMap<String,Boolean>>();
这是因为在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!
我认为这是因为Map<String, Boolean>
和HashMap<String,Boolean>
之间的差异。 的确,泛型在这里是一个规范,两边必须是相同的。 (或者至少这是我的看法)。
在第二种情况下,myMap
是密钥类型为String
,值为Map<String, Boolean>
类型的映射。 HashMap<String, Boolean>
不是Map<String, Boolean>
它实现它。因此,这将编译:
Map<String, ? extends Map<String, Boolean>> myOtherMap =
new HashMap<String,HashMap<String,Boolean>>();
HashMap
里基的权利,使用“是一个”是不幸的(因为HashMap是一个地图)。基本上使用'? extends'放宽Generic的类型要求,从完全匹配到继承层次匹配。 – idbrii 2011-01-13 17:26:37
但是,鉴于myMap的声明,只要它们实现Map接口,我会关心哪种地图放置在那里? – extraneon 2010-09-03 14:52:19
@extraneon:在这种情况下,请参阅鲍里斯的答案。 – Powerlord 2010-09-03 14:56:00
@extraneon,看我更新的例子。 – 2010-09-03 14:57:41