为了账号安全,请及时绑定邮箱和手机立即绑定

IntelliJ显示instanceof为“ always true”提示,但不显示

IntelliJ显示instanceof为“ always true”提示,但不显示

皈依舞 2021-05-04 17:57: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 { }IntelliJtwo instanceof Two在行中给我一个提示“ [...]始终为真”,但是对于one instanceof TwoIntelliJ,我没有给我一个“ [...始终为假”的提示。有人知道为什么吗?
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

在IDEA 2018.3。中修复


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


简短答案:因为尚未实施。


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

    }

  }

}

但是,对于您的情况,此模型还不够。我们需要扩展它以跟踪变量的确切类型。在你的代码中,我们跟踪one的instanceof One(这是兼容instanceof Two的事实),尽管该new表达式,我们可以知道,更精确的类型信息one的exactly One。这通常不可用,因为在大多数情况下(变量是方法参数,变量是从方法返回,变量是从字段,数组元素,转换表达式等分配的),我们无法知道类型是精确类型还是子类型,因此当前的模型是完全令人满意的。我可以想象只有两种情况可以使用exactly One事实跟踪:new表达式(如您的情况)和经过比较的如obj.getClass() == Xyz.class。


我认为,这是实施的合理功能。我已经考虑过了,但是除了我之外,还有其他人在乎我提出了一个问题,因此您可以进行跟踪。


查看完整回答
反对 回复 2021-05-19
  • 1 回答
  • 0 关注
  • 451 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信