我想使用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
答案 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);