ワイルドカード キャプチャは、複数のジェネリック レベルの深さにはなりません。したがって、これが機能している間:
LinkedList<? extends Number> test = new LinkedList<Integer>();
これはしません:
LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();
私が考えることができる最も合理的な説明は、ジェネリックを最も外側のレベルで不変であると考えることです。aLinkedList<List<Integer>>
が aLinkedList<List<? extends Number>>
であっても、aがList<Integer>
aではないList<? extends Number>
のと同じ理由で、aは a ではありません。ここでは、 はそのままです。List<Dog>
List<Animal>
Dog
Animal
Dog
Animal
List<Integer>
List<? extends Number>
さて、犬/動物の解決策は? extends
次のとおりです。
List<? extends Animal> animals = new List<Dog>();
同じ理由を適用すると、別の回避策があります? extends
。
LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>();
ただし、最初の? extends
. 参照型変数は、それが実際にnumList
どのサブタイプであるかを認識していません。List<? extends Number>
その可能性がArrayList<Integer>
あるため、Java は、そのようなものをそのようなものに追加できるタイプ セーフを提供できませんLinkedList
。型の安全性を維持するために、コンパイラはnull
. ワイルドカードを使用せずに、ジェネリック型パラメーターを正確に一致させる必要があります: LinkedList<List<Integer>> numList = new LinkedList<List<Integer>>();
。List<Integer>
このような にを追加できますLinkedList
。