2010-11-20 234 views
2

我想创建的字符串列表清单,类型不匹配错误

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

并获得类型不匹配错误:不能转换从ArrayList<ArrayList<String>>List<List<String>>

我知道我可以改变

List<List<String>> to ArrayList<ArrayList<String>> 

,它会正常工作。

但我只是想知道为什么它不让它发生?简单的List<Object>可以参考ArrayList<Object>所以这有什么不同?

回答

1

因为List<List<String>>会接受不是数组列表的其他字符串列表,这不是您最初声明类型的方式。例如,如果您转换为List<List<String>>,那么您在技术上会被允许向其添加LinkedList<String>!这不是一个ArrayList<String>。允许演员阵容将有效地打破泛型类型系统。

换句话说,你可能转换为List<ArrayList<String>>。但不是List<List<String>>

+0

谢谢你,很好的解释。另外,感谢StudiousJoseph。 – 2010-11-20 07:07:34

1
List<List<String>> string = new ArrayList<List<String>>() 

会是正确的做法。

问候,

1

不能分配给ArrayList<ArrayList<String>>List<List<String>>因为它违反了泛型的编译时类型安全的承诺。如果这项任务是有效的,那么我们可以将LinkedList<String>插入ArrayList<ArrayList<String>>并破坏类型安全性。

这是的典型示例是List<Number>不是List<Integer>。它可以通过矛盾容易地表现出来。

List<Integer> ints = new ArrayList<Integer>(); 
ints.add(42); 

//This results in compiler error 
/* List<Number> nums = ints; */ 
//If it were not and an error, then you could 

List<Number> nums = ints; 
//Now you can insert doubles into a list of `Number`s 
nums.add(0.1); 

//This would allow 0.1 to assign to an int 
Integer x=ints.get(1); 
//This will cause ClassCastException and 
//violate type-safety provided by generics. 
0

除了什么家伙已经说过,我想发现你写的定义: 的ArrayList>() 为你工作,但还不够好。

你应该说:

名单>名单=新的ArrayList>();

如果存在抽象类或接口,该规则从不将具体类写入泛型定义,并且在赋值的左侧部分不写入。我的版本允许在将来更改列表实现,而无需更改使用此数据结构的代码。

此外List是一个集合。如果您使用特定列表的功能无关紧要(例如如果你打算只遍历这个列表),你可以说:

Collection> list = new ArrayList>();

在这种情况下,在未来,你甚至可以更改列表设置:

集>列表=新LinkedHashSet>();