私が書いた場合:
List<List<String>> strings = new ArrayList<ArrayList<String>>();
次のコンパイラエラーが発生します。
Type mismatch: cannot convert from ArrayList<ArrayList<String>> to List<List<String>>
なんで?
ジェネリックは共変ではないため、次を使用する必要があります。
List<List<String>> strings = new ArrayList<List<String>>();
外側の右側の宣言がどのようにArrayList
「なる」ことができるかに注意してくださいList
。ジェネリックに表示されるものには同じことは適用できません。
あなたはあなたが望むコードをすることができます、あなたはあなたの初期化を更新する必要があります:
List<List<String>> strings = new ArrayList<List<String>>();
次に、外部リストに追加するアイテムごとに、次のようにします。
strings.add(new ArrayList<String>());
これが許可されていれば、ある時点でそのリストがArrayListのリストであることに依存し、他の場所に何か他のものを押し込むことになりかねません。
たとえば、これを行うことも合法です。
ArrayList<ArrayList<String>> arrayLists = new ArrayList<ArrayList<String>>();
List<List<String>> unknownLists = arrayLists ;
unknownLists.append(new LinkedList<String>());
for (ArrayList<String> l : arrayLists ) // (1)
System.out.println(l);
これは正常にコンパイルされますが、(1)でClassCastExceptionが発生します。
タイプが固執しているので、それを行うことはできません。ただし、次のように書くことができます。
List<? extends List<String>> strings = new ArrayList<ArrayList<String>>();