如果我写:
List<List<String>> strings = new ArrayList<ArrayList<String>>();
我收到以下编译错误:
Type mismatch: cannot convert from ArrayList<ArrayList<String>> to List<List<String>>
为什么?
答案 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>>();