以下の行は私にエラーを与えます:
Incompatible Types.
List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();
理由は何ですか?
[〜#〜] edit [〜#〜]
2番目のArrayListをListに変更しても、エラーにはなりません。しかし、エラーの理由を知りたいです。ありがとう
List<List<Integer>>
がある場合は、LinkedList<Integer>
を追加できます。ただし、ArrayList<ArrayList<Integer>>
に対してこれを行うことはできないため、後者をList<List<Integer>>
のタイプにすることはできません。
これは、ジェネリックを使用したプログラミングに関してよくある誤解ですが、学ぶべき重要な概念です。
Box<Integer>
は、IntegerがNumberのサブタイプであっても、Boxのサブタイプではありません。
List<List<Integer>> ret = new ArrayList<List<Integer>>();
このようにして、ArrayList
だけでなくLinkedList
をret
に追加できます。
その理由は、ジェネリックは 共変 。ではないからです
より単純なケースを検討してください。
List<Integer> integers = new ArrayList<Integer>();
List<Number> numbers = integers; // cannot do this
numbers.add(new Float(1337.44));
リストはフロートを保持していますが、これは確かに悪いです。
あなたの場合も同じです。
List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
List<List<Integer>> ll = al; // cannot do this
ll.add(new LinkedList<Integer>())
ll
を保持するリストLinkedList
ができましたが、al
はArrayList
sのリストとして宣言されています。
Java Doc に明記されています
一般に、FooがBarのサブタイプ(サブクラスまたはサブインターフェース)であり、Gが一般的な型宣言である場合、_
G<Foo>
_が_G<Bar>
_。これはおそらく、ジェネリックについて深く学ぶべき直観に反するため、ジェネリックについて学ぶ必要がある最も難しいことです。
ここでも同じことが起こります。_Bar = List<Integer>
_と_Foo = ArrayList<Integer>
_は_ArrayList<ArrayList<Integer>>
_が_List<List<Integer>>
_のサブタイプではないためです
テキストの削減とその他の修正:
List<List<Integer>> lists = new ArrayList<>();
または
List<List<Integer>> lists = new ArrayList<List<Integer>>();