在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)
代码完美无缺.这背后的原因是什么?
提前致谢.
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 也会对此提供更多说明。
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |