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如何“变成” a 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 回答