繁体   English   中英

在Java 7中使用菱形运算符

[英]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));

代码完美无缺。 这背后的原因是什么?

提前致谢。

Arrays.asList是一个通用方法,因此从技术上讲,它可以调用为:

Arrays.<Number> asList(1, 2, 3);

甚至在Java 7之前,语言可以做一些有限的推断,以便在左侧知道时消除这种情况,如

final List<Number> nums = Arrays.asList(1, 2, 3);

看起来你偶然发现了两种类型的推理无法成功组合的边缘情况,其中钻石推理和通用方法推理不相处。 我敢肯定如果你要挖掘它,JLS也会对此有所了解。

Java Generics是Invariant,而Arrays是Covariant。

如果Java中的泛型是协变的,如果AB的子类型,则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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM