为什么 Java 类型推断在 int 数组集合的构造函数中失败,例如优先队列<int[]>?

Why Java type inference fails in constructor for Collection of int array e.g. PriorityQueue<int[]>?

我在构建 int 数组的 PriorityQueue 时看到一些错误:

PriorityQueue<int[]> maxPQ = new PriorityQueue((a, b) -> (a[0] - b[0])); // errors

Line 1: error: array required, but Object found PriorityQueue<int[]> maxPQ = new PriorityQueue((a, b) -> (a[0] - b[0])); Line 1: error: array required, but Object found PriorityQueue<int[]> maxPQ = new PriorityQueue((a, b) -> (a[0] - b[0]));

但是在添加菱形运算符或完整类型后错误会消失:

PriorityQueue<int[]> maxPQ = new PriorityQueue<>((a, b) -> (a[0] - b[0])); // diamond operator works

PriorityQueue<int[]> maxPQ = new PriorityQueue<int[]>((a, b) -> (a[0] - b[0])); // this also works

这与数组无关。这是关于原始类型的概念。当你写 new PriorityQueue() 时,那么 那是一个原始类型 ;推理不会启动(参见:Java 语言规范);这就是钻石运算符的用途。

进入原始模式后,请注意原始模式具有传染性。它不仅使这种类型变得原始,而且使它周围的大多数事物变得原始。在这种情况下,包括用于确定 (a, b) -> 中 a 和 b 应该是什么类型的从外到内的解决方案。因为您现在是原始制作的,所以您只得到下限,即 Object.

解决方案:切勿使用 'raw' 模式 - 这适用于早于 java1.5(引入泛型时)的旧代码。钻石算子没问题,这里