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

为什么在int数组集合的构造函数中Java类型推断失败,例如PriorityQueue<;int[]>;?,java,generics,collections,type-inference,Java,Generics,Collections,Type Inference,我在构造int数组的PriorityQueue时看到一些错误: PriorityQueue<int[]> maxPQ = new PriorityQueue((a, b) -> (a[0] - b[0])); // errors PriorityQueue maxPQ=newpriorityqueue((a,b)->(a[0]-b[0]);//错误 第1行:错误:需要数组,但找到对象 PriorityQueue maxPQ=新的PriorityQueue((a,b)->(a

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

PriorityQueue<int[]> maxPQ = new PriorityQueue((a, b) -> (a[0] - b[0])); // errors
PriorityQueue maxPQ=newpriorityqueue((a,b)->(a[0]-b[0]);//错误
第1行:错误:需要数组,但找到对象 PriorityQueue maxPQ=新的PriorityQueue((a,b)->(a[0]-b[0]); 第1行:错误:需要数组,但找到对象 PriorityQueue maxPQ=新的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
PriorityQueue maxPQ=newpriorityqueue((a,b)->(a[0]-b[0]);//钻石操作员工作
PriorityQueue maxPQ=新的PriorityQueue((a,b)->(a[0]-b[0]);//这同样有效

这与阵列无关。这是关于原始类型的概念。当您编写
newpriorityqueue()
时,则这是一个原始类型;推理不起作用(参见:Java语言规范);这就是钻石操作员的作用

一旦进入原始模式,请注意原始模式是有传染性的。它不仅使这种类型的原始,但它周围的大多数东西。在这种情况下,包括用于确定
(a,b)->
中a和b的类型的“从外到内”分辨率。因为你现在处于原始状态,你只需要得到下限,即对象


解决方案:永远不要使用“原始”模式——这是针对java1.5之前的旧代码(当引入泛型时)。菱形运算符在这里很好。

因为您省略了泛型类型参数,所以
a
b
对象
,而不是
int[]
。所以订阅它们是非法的。相关:…并且永远不要使用减号来实现比较器。负可以溢出<代码>比较器。比较器(a->a[0])工作可靠。