Map <string,map <string,=“”boolean =“”>&gt; myMap = new HashMap <string,hashmap <string,boolean>&gt;(); </string,hashmap <string,boolean> </string,>

时间:2010-09-03 14:42:07

标签: java map nested hashmap

为什么这不适用于java,但确实如此

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

只是为了澄清下面对嵌套HashMap的更改显示了编译器错误,而上面并没有;使用Map(不是hashmap)

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

3 个答案:

答案 0 :(得分:10)

这是因为Java中的泛型是不变的,即使B类是A,Collection<B> a 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!

答案 1 :(得分: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>>();

答案 2 :(得分:-1)

我认为这是因为Map<String, Boolean>HashMap<String,Boolean>之间存在差异。 实际上,仿制药在这里是一个规范,双方必须是相同的。 (或至少是我的意见)。