gpt4 book ai didi

java - IntelliJ 显示 "always true"提示但不显示 "always false"的 instanceof

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:13 25 4
gpt4 key购买 nike

所以,我使用 IntelliJ IDEA 在 Java 中进行编程,并且我正在试验关键字 instanceof,我的代码最终看起来像这样:

public class Main {

public static void main(String args[])
{
One one = new One();
One two = new Two();

if (one instanceof Two)
{
System.out.println(one);
}

if (two instanceof Two)
{
System.out.println(one);
}

}
}

class One { }

class Two extends One { }

IntelliJ 在 two instanceof Two 行提示“[...] 总是正确的”,但是对于 one instanceof Two IntelliJ 没有给我一个“[...] 总是错误的”提示。有谁知道为什么吗?

最佳答案

更新:已在 IDEA 2018.3 中修复。


(免责声明:IntelliJ IDEA 开发人员在此,负责此功能)。

简短的回答:因为它没有实现。

当我们在数据流分析中跟踪变量的实际类型时,我们使用 TypeConstraint 描述的模型类(class)。它允许我们跟踪两种事实:1)如果变量实际类型是 instanceof something 和 2)如果变量实际类型不是 instanceof something。有了这些事实,我们可以在许多情况下推断出总是真/总是假的 instanceof 例如:

void test(Object foo) {
if (foo instanceof String) {
if (foo instanceof Integer) {
// always false: "instanceof String" fact is not compatible
// with "instanceof Integer"
}
}
}

或者

void test(Object foo) {
if (!(foo instanceof Number)) {
if (foo instanceof Integer) {
// always false: "not instanceof Number" fact is not compatible
// with "instanceof Integer"
}
}
}

但是对于你的情况,这个模型是不够的。我们需要扩展它来跟踪变量的确切类型。在您的代码中,我们跟踪 oneinstanceof One(与 instanceof Two 事实兼容),尽管 new 表达式,我们可以知道更精确的类型信息,即 oneexactly One。这并不经常使用,因为在大多数情况下(变量是方法参数,变量从方法返回,变量从字段赋值,数组元素,强制转换表达式等)我们无法知道类型是精确类型还是子类型,所以目前的模型是完全令人满意的。我可以想象只有两种情况 exactly One 事实跟踪是有用的:new 表达式(就像你的情况一样)和比较之后像 obj.getClass() = = Xyz.class.

我认为,这是一个可以合理实现的功能。我已经考虑过了,但因为除了我之外还有其他人也很关心,所以我提交了an issue , 这样您就可以跟踪它。

关于java - IntelliJ 显示 "always true"提示但不显示 "always false"的 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com