ArrayList类型推断

时间:2014-10-08 02:11:01

标签: java

我想使用ArrayList构造函数:

ArrayList(Collection<? extends E> c) 

如下。

List<Integer> li = new ArrayList<>(); 

List<Number> ln = new ArrayList<>(li); // won't compile.. Type mismatch: cannot convert from ArrayList<Integer> to List<Number>

我不明白编译错误。

但是,以下编译正常。

List<Number> ln = new ArrayList<Number>(li); 

我错过了什么?使用java 7

2 个答案:

答案 0 :(得分:1)

问题是Java创建了一个ArrayList&lt; Integer&gt;类型的新对象。这不能分配给List&lt; Number&gt;类型的变量,因为Integer与Number不完全相同。你必须使用这样的通配符:

List<Integer> li = new ArrayList<>(); 
List<? extends Number> ln = new ArrayList<>(li);

这允许将扩展Number的泛型类型Integer的列表分配给List&lt; Number&gt;类型的变量。点击此处了解更多信息:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

答案 1 :(得分:0)

这是“钻石运营商”的限制。

List<Number> ln = new ArrayList<>(li);

扩展到

List<Number> ln = new ArrayList<Integer>(li);

无法编译。

你可以通过更明确地解决它:

List<Number> ln = new ArrayList<Number>(li);
相关问题