在Java 7中使用菱形运算符

Aka*_*oel 7 java generics

在Java 7之前,下面的语法用于创建ArrayList,

ArrayList<Integer> ints = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7));
Run Code Online (Sandbox Code Playgroud)

但是从Java 7开始我们可以省略构造函数中的泛型类型,即:

ArrayList<Integer> ints = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
Run Code Online (Sandbox Code Playgroud)

但当我尝试做类似的事情时,

ArrayList<Number> nums = new ArrayList<>(Arrays.asList(1,2,3,4,4,5.5,6.6,7.7));
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,但是当我在右侧提到通用类型时,即

ArrayList<Number> nums = new ArrayList<Number>(Arrays.asList(1,2,3,4,5.5,6.6,7.7));
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Tom*_*m G 4

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

Arrays.<Number> asList(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

即使在 Java 7 之前,当左侧已知时,该语言也可以进行一些有限的推理来消除这种情况,如下所示

final List<Number> nums = Arrays.asList(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

看起来您偶然发现了一种边缘情况,其中两种类型的推理无法成功组合,菱形推理和泛型方法推理无法相处。我确信,如果您深入研究的话,JLS 也会对此提供更多说明。