[英]Using diamond operator in Java 7
在Java 7之前,下面的语法用于创建ArrayList,
ArrayList<Integer> ints = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7));
但是从Java 7开始我们可以省略构造函数中的泛型类型,即:
ArrayList<Integer> ints = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
但当我尝试做类似的事情时,
ArrayList<Number> nums = new ArrayList<>(Arrays.asList(1,2,3,4,4,5.5,6.6,7.7));
我得到一个错误,但是当我在右侧提到通用类型时,即
ArrayList<Number> nums = new ArrayList<Number>(Arrays.asList(1,2,3,4,5.5,6.6,7.7));
代码完美无缺。 这背后的原因是什么?
提前致谢。
Java Generics是Invariant,而Arrays是Covariant。
如果Java中的泛型是协变的,如果A
是B
的子类型,则List[A]
是List[B]
的子类型。 但在Java中并非如此。 (Scala有一个协方差实现。在Scala中,如果B
扩展A
,那么List[B]
扩展List[A]
)
但String[]
是Object[]
子类型
因此,无法像您的情况那样将ArrayList<Double>
强制转换为ArrayList<Number>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.