ワイルドカード キャプチャは、複数のジェネリック レベルの深さにはなりません。したがって、これが機能している間:
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>DogAnimalDogAnimalList<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。