加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – IntelliJ显示“始终为true”提示但不是“始终为false”

发布时间:2020-12-15 03:04:53 所属栏目:Java 来源:网络整理
导读:所以,我使用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.p
所以,我使用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给了我两个实例的两行暗示“[…]总是真的”,但是对于一个实例,两个IntelliJ并没有给我一个“[…]总是假的”提示.有谁知道为什么?

解决方法

更新:已在IDEA 2018.3中修复.

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

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

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

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"
    }
  }
}

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

我认为,实施这是一个合理的功能.我已经考虑过了,但是除了我以外的其他人也在乎,我提交了an issue,所以你可以跟踪它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读