热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IntelliJ显示"始终为真"提示但不是"总是假",例如

如何解决《IntelliJ显示"始终为真"提示但不是"总是假",例如》经验,为你挑选了1个好方法。

所以,我使用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 TwoIntelliJ并没有给我一个"[...]总是假的"提示.有谁知道为什么?



1> Tagir Valeev..:

更新:已在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"
    }
  }
}

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

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


推荐阅读
author-avatar
手机用户2502901265_642
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有