【问题标题】:IntelliJ show "always true" hint but not "always false" for instanceofIntelliJ 显示“始终为真”的提示,但不显示“始终为假”的 instanceof
【发布时间】:2018-07-07 16:55:25
【问题描述】:

所以,我使用 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 的贡献者才能回答这个问题。首选项中对这项检查的描述并没有说太多,我无法在网上找到其他任何内容。
  • 我同意其他评论。 Intellij 开发人员在这里回答您很幸运,但我认为您的问题应该是直接在他们的网站上报告错误
  • @GhostCat 以及 IDEA Java 支持是开源 IDEA 社区的一部分,任何人都可以深入研究代码并了解它为什么不起作用。虽然我同意 IDEA 开发人员更容易回答。同样在错误报告中,没有人会解释为什么它目前不起作用,所以这个问题没有答案。
  • 我非常感谢您的回答,并为此投了赞成票。我只是说,一般来说,人们应该记住可能是某个 3rd 方工具上的错误...应该在那里报告为错误。

标签: java oop intellij-idea instanceof


【解决方案1】:

更新:已在 IDEA 2018.3 中修复。


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

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

当我们在数据流分析中跟踪实际类型的变量时,我们使用TypeConstraint 类描述的模型。它允许我们跟踪两种类型的事实:1)如果变量实际类型是 instanceof 2)如果变量实际类型不是 instanceof。有了这些事实,我们可以在许多情况下推断总是真/总是假 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,所以你可以跟踪它。

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-05-31
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多