4

私が書いた場合:

List<List<String>> strings = new ArrayList<ArrayList<String>>();

次のコンパイラエラーが発生します。

Type mismatch: cannot convert from ArrayList<ArrayList<String>> to List<List<String>>

なんで?

4

4 に答える 4

8

ジェネリックは共変ではないため、次を使用する必要があります。

List<List<String>> strings = new ArrayList<List<String>>();

外側の右側の宣言がどのようにArrayList「なる」ことができるかに注意してくださいList。ジェネリックに表示されるものには同じことは適用できません。

于 2013-01-24T20:05:31.987 に答える
1

あなたはあなたが望むコードをすることができます、あなたはあなたの初期化を更新する必要があります:

List<List<String>> strings = new ArrayList<List<String>>();

次に、外部リストに追加するアイテムごとに、次のようにします。

strings.add(new ArrayList<String>());
于 2013-01-24T20:06:02.963 に答える
0

これが許可されていれば、ある時点でそのリストが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が発生します。

于 2013-01-24T20:14:20.163 に答える
0

タイプが固執しているので、それを行うことはできません。ただし、次のように書くことができます。

List<? extends List<String>> strings = new ArrayList<ArrayList<String>>();
于 2013-01-24T20:19:13.017 に答える