鉴于此代码:
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 PriorityQueuecreateMaxHeapByHeight() { return new PriorityQueue<>(new Comparator () { @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
?这里的逻辑是什么?
当您在设置中查找检查时,其描述如下:
报告赋值和函数调用,其中赋值的变量的名称或函数参数似乎与分配给它的值的名称不匹配.例如:
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
,可能要代表一定水平偏移,它的名字.
您可以从检查设置中删除这些名称组以解决此问题(或完全禁用检查):
你可以在这里看到逻辑:https://github.com/JetBrains/intellij-community/blob/210e0ed138627926e10094bb9c76026319cec178/java/java-analysis-impl/src/com/intellij/codeInspection/suspiciousNameCombination/SuspiciousNameCombinationInspectionBase.java
相关的块是这样的:
public SuspiciousNameCombinationInspection() { addNameGroup("x,width,left,right"); addNameGroup("y,height,top,bottom"); }
x
被认为是兼容width
,left
并right
,但不与height
(反之亦然).