作者:syjs10 | 来源:互联网 | 2023-05-22 11:33
这是Java代码:
public static boolean anyEqual(Object needle, Object... haystack) {
if(needle == null || haystack == null) {
return false;
}
if(haystack.length == 0) {
return false;
}
for(Object match : haystack) {
if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) {
return true; // warning from IntelliJ here, 'contract clause !null, null -> false is violated'
}
}
return false;
}
有没有人知道为什么要显示它?contract clause !null, null -> false is violated
?谢谢!
IntelliJ 14.0.2 build:139.659
截图:
1> Makoto..:
IntelliJ推断你的方法的正式合同是这样的:
null, _ -> false; !null, null -> false
这实际意味着什么:
第一个合同指定,只要第一个参数是null
,它就会返回false
.您的第一个if
声明就是这样:
if(needle == null || haystack == null) {
return false;
}
第二个合同指定,如果第二个参数是null
,则它将返回false
.这也由if
上面的相同声明指定.
我的直觉告诉我,除了上述所有内容之外,IntelliJ在识别循环的正式合同方面遇到了一些麻烦,尽管它与合同表达式中的另一个条件一样简单.
for(Object match : haystack) {
if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) {
return true;
}
}
让我们简要介绍一下.
如果haystack
长度为0,则不会触发enhanced-for语句,因此需要考虑这一点.
数组内部的元素可能是null
,我不完全确定IntelliJ的静态分析还涵盖了那个部分.
我们已经确定needle
必须是非空的,所以没有违反合同的那条线.
如果我们有一个场景,其中match != null && needle.getClass() == match.getClass() && needle.equals(match)
是true
,我们返回true
.否则,我们回来false
.
有什么我可以正式文档中看到,才使我们需要说的,表达"哎-我们正在检查的数组中的元素!" 可能的情况是true
,尽管我们上面已经说过(因为haystack
非空),但我们正在返回这一事实.
请允许我强调这一点:
haystack
必须不是null
为了让你进入增强型. 您的代码将无法正常工作.
总而言之,我不担心.更好的是,提交一个针对它的错误,以便可以修复或扩展此类事情.