このステートメントは機能していません
Map<String, HashMap<String, Object>> customs = new LinkedHashMap<String, CustomHashMap>();
customs
はタイプであり、は のサブクラスである タイプMap<String, HashMap<String, Object>>
の を割り当てているためです。LinkedHashMap
<String, CustomHashMap>
CustomHashMap
HashMap<String, Object>
ジェネリックスはinvariant
次のとおりです。 任意の 2 つの異なる型T1
およびはT2
、HashMap<String, T1>
のサブタイプでもスーパータイプでもありませんHashMap<String, T2>
。したがって、LinkedHashMap<String, CustomHashMap>
に割り当てることはできませんMap<String, HashMap<String, Object>>
。一方、配列は です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 によって適切に説明されており、これは受け入れられた回答です。