这个说法不成立
Map<String, HashMap<String, Object>> customs = new LinkedHashMap<String, CustomHashMap>();
因为customs
is 的类型Map<String, HashMap<String, Object>>
,你正在分配一个LinkedHashMap
类型<String, CustomHashMap>
,其中CustomHashMap
是 的子类HashMap<String, Object>
。
泛型是invariant
: 对于任何两种不同的类型T1
,并且T2
,HashMap<String, T1>
既不是 的子类型也不是超类型HashMap<String, T2>
。所以,LinkedHashMap<String, CustomHashMap>
不能分配给Map<String, HashMap<String, Object>>
. 另一方面,数组 are covariant
,这意味着下面的语句将编译而没有任何错误或警告。但是,如果您将任何其他子类型HashMap<String, Object>
放入其中,它可能会在运行时失败(这可能会造成更大的伤害) CustomHashMap
:
HashMap<String, Object>[] mapArray = new CustomHashMap[1];
mapArray[0] = new CustomHashMap_1();// this will throw java.lang.ArrayStoreException
现在,如果要分配LinkedHashMap<String, CustomHashMap>
给Map<String, HashMap<String, Object>>
,请将语句更改为:
Map<String, ? extends HashMap<String, Object>> customs = new LinkedHashMap<String, CustomHashMap>();
@Seelenvirtuose 很好地解释了有关此方法的一些附加信息,这是公认的答案。