这个说法不成立
Map<String, HashMap<String, Object>> customs = new LinkedHashMap<String, CustomHashMap>();
因为customsis 的类型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 很好地解释了有关此方法的一些附加信息,这是公认的答案。