为什么这不适用于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>>();
答案 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>
之间存在差异。
实际上,仿制药在这里是一个规范,双方必须是相同的。 (或至少是我的意见)。