2016-10-18 4 views
1

一般的なタイプのテストを行いました。HashMapの値の汎用タイプ(リスト<? extends>)

class A {} 
class B extends A {} 

が2つの方法です:

private static void extendTest(List<? extends A> superList) { 
    System.out.println("extendTest over."); 
} 

private static void extendMapTest(HashMap<String, List<? extends A>> superMap) { 
    System.out.println("extendMapTest over."); 

} 

は、私はlistmapを作成します。

List<B> childList = new ArrayList<>(); 
childList.add(new B()); 
extendTest(childList); // TAG1: it is OK. 

HashMap<String, List<B>> childMap = new HashMap<>(); 
childMap.put("hello", childList); 
extendMapTest(childMap); // TAG2: ERROR! 

TAG1はOKで、TAG2は誤りである理由? TAG2を修正するにはどうすればよいですか?

+0

エラーを報告する。 – nbrooks

答えて

4

List<? extends A>は、List<B>のスーパータイプではありません。 the offical generics tutorial on upper boundingを参照してください。

次のように定義したchildListを、修正するには: BAあるので、あなたはまだ、List<A>Bを追加することができます

List<A> childList = new ArrayList<>(); 

そして、このようなあなたのマップ方法を定義:List<Integer>が数と整数が関連していると示されるのと同じ方法AnyClass<A>AnyClass<B>と関連していないにもかかわらず、List<Number>のサブタイプではないように簡単です

private static void extendMapTest(HashMap<String, List<A>> superMap) {... 
0

docsあまりに

に簡単なオプションがあまりにもワイルドカードを使用してマップを定義し、何のコード変更は

HashMap<String, List<? extends A>> childMap = new HashMap<>(); 
のように、必要とされません

例えばデモ

class A {} 
class B extends A { 
    public int a=9; 
} 


private static void extendTest(List<? extends A> superList) { 
     System.out.println("extendTest over."); 
    } 

    private static void extendMapTest(HashMap<String, List<? extends A>> superMap) { 
     System.out.println("extendMapTest over."+((B)(superMap.get("hello").get(0))).a); 

    } 

     List<B> childList = new ArrayList<>(); 
     childList.add(new B()); 
     extendTest(childList); 

     HashMap<String, List<? extends A>> childMap = new HashMap<>(); 
     childMap.put("hello", childList); 
     extendMapTest(childMap); 

出力に変更されたコードで考慮すべき

extendTest over. 
extendMapTest over.9 
0

一つ。

あなたが別のクラス

class C extends A {} 

を作成することができますし、あなたのextendMapTest(HashMap<String, List<? extends A>> superMap)

の内側にあなたが自由に:

List<C> list = new ArrayList<>(); 
list.add(new C()); 
superMap.put("A", list); 

それがchildMapオブジェクトあなたの宣言と矛盾していますextendMapTestに渡す

HashMap<String, List<B>> childMap 

コンパイルエラーによりこのようなことが起こらないと思われます。

関連する問題