为什么在int数组集合的构造函数中Java类型推断失败,例如PriorityQueue<;int[]>;?
我在构造int数组的PriorityQueue时看到一些错误:为什么在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
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])工作可靠。