鉴于此代码:
private static class Building {
private final int left;
private final int right;
private final int height;
private Building(int left, int right, int height) {
this.left = left;
this.right = right;
this.height = height;
}
}
private PriorityQueue<Building> createMaxHeapByHeight() {
return new PriorityQueue<>(new Comparator<Building>() {
@Override
public int compare(Building o1, Building o2) {
return -Integer.compare(o1.height, o2.height);
}
});
}
IntelliJ显示上面比较行的警告,说:
return -Integer.compare(o1.height, o2.height); // ^^^^^^^^^ // 'height' should probably not be passed as parameter 'x'
可以通过对语句发表评论来抑制警告:
//noinspection SuspiciousNameCombination
好的,但是这里有什么可疑的?
此外,如果我将比较字段更改为left
或right
(仅为了播放和调查),警告会转移到第二个参数,例如:
return -Integer.compare(o1.right, o2.right); // ^^^^^^^^ // 'right' should probably not be passed as parameter 'y'
再次,这里有什么可疑的?为什么它会抱怨字段height
的第一个参数,以及字段left
和right
的第二个参数?这里的逻辑是什么?
答案 0 :(得分:13)
在设置中查找检查时,其说明如下:
报告赋值和函数调用,其中包含变量的名称 分配了值或函数参数似乎没有 匹配分配给它的值的名称。例如:
var x = 0; var y = x;
或
var x = 0, y = 0; var rc = new Rectangle(y, x, 20, 20);
配置窗格允许指定不应该的名称 一起使用:如果参数名称或,则报告错误 赋值目标名称包含一个组中的单词和名称 已分配或已传递的变量包含来自其他组的单词。
因为Integer.compare
的签名是public static int compare(int x, int y)
,所以IntelliJ会感到困惑并且认为你试图将语义上代表高度的东西传递给参数x
,该参数可能代表一些水平偏移,名字。
您可以从检查设置中删除这些名称组以解决此问题(或完全禁用检查):
答案 1 :(得分:6)
相关的块是这样的:
public SuspiciousNameCombinationInspection() {
addNameGroup("x,width,left,right");
addNameGroup("y,height,top,bottom");
}
x
被视为与width
,left
和right
兼容,但不与height
兼容(反之亦然)。