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

因此,我使用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,我没有给我一个“ [...始终为假”的提示。有人知道为什么吗?


皈依舞
浏览 452回答 1
1回答

大话西游666

在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。我认为,这是实施的合理功能。我已经考虑过了,但是除了我之外,还有其他人在乎我提出了一个问题,因此您可以进行跟踪。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java