9

次のコードをコンパイルしようとすると:

LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();

型の互換性がないというエラーが表示されます。

Required: LinkedList <java.util.list<? extends java.lang.Number>>
Found: LinkedList <java.util.list<Integer>>

拡張する要素を持つ s である要素LinkedListを含むa を持つにはどうすればよいですか?ListNumber

numList明確にするために、次の方法でリストを追加しようとしています。

numList.add(new LinkedList<Integer>());

4

1 に答える 1

14

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

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

于 2013-11-25T22:42:59.283 に答える