为什么Java不允许注入嵌套泛型?

时间:2013-01-24 20:03:16

标签: java generics

如果我写:

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

我收到以下编译错误:

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

为什么?

4 个答案:

答案 0 :(得分:8)

泛型不是共变体,因此您必须使用:

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

请注意外部右侧声明ArrayList如何“成为”List。同样不能应用于泛型中出现的任何内容。

答案 1 :(得分:1)

您可以执行所需的代码,只需更新初始化:

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

然后,对于要添加到外部列表的每个项目:

strings.add(new ArrayList<String>());

答案 2 :(得分: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。

答案 3 :(得分:0)

你不能这样做因为类型是坚持的。但是,您可以这样写:

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