2016-09-18 8 views
0

ジェネリックを使用してキーと値の間の型の関係を強制するマップラッパーを実装したいと思います。 次のコードはコンパイルされません:ネストされた構造でコンパイルされない一般的なマップ

Map<Class<? extends Serializable>, List<List<? extends Serializable>>> collection = new HashMap(); 

private <T extends Serializable> void add(Class<T> type, List<List<T>> item) { 
    collection.put(type, item); 
} 

このコンパイルのに対し:

Map<Class<? extends Serializable>, List<? extends Serializable>> collection = new HashMap(); 

private <T extends Serializable> void add(Class<T> type, List<T> item) { 
    collection.put(type, item); 
} 

なぜ2番目と3番目のレベルのジェネリック型の違いはありますか?

+0

基本的にも同じである他のいくつかの質問があります - 提案デュープは、その答え私は見られるものの中の1つです私は最高だと思う。 –

+0

生の種類は使用しないでください。 – shmosel

答えて

2

ジェネリックが不変あり、マップの第二種のパラメータはputの第2引数は正確にこのに一致しなければならないことを意味し、List<List<? extends Serializable>>です。

すなわち、それは正確なパラメータList<? extends Serializable>を持っている場合にのみ、マップにListを追加することができ、かつT正確? extends Serializableではありません。

あなたのマップとメソッドの宣言では、別の? extendsを持っていることによって、この問題を解決することができます

Map<Class<? extends Serializable>, List<? extends List<? extends Serializable>>> collection = new HashMap<>(); 

private <T extends Serializable> void add(Class<T> type, List<? extends List<T>> item) { 
    collection.put(type, item); 
} 
関連する問題