测试`instanceof`是多余的,可以用`!= null`代替?

时间:2014-11-12 15:16:31

标签: java intellij-idea android-studio

在AndroidStudio中,使用intellij,我在我的代码中得到以下建议。我想知道为什么要提出这个建议。

我有多个Child类继承自ParentB,而ParentB继承自ParentA

我有条件需要测试我有ParentB的子类。我们说我有4个孩子。 ChildAChildBChildCChildD。所有这些孩子都继承自Child

所以我有以下内容:

public void test(Child myChild) {

    anotherTest((ChildA)myChild);
    if (myChild instanceof ChildA) {
        //dosomething
    } else if(myChild instanceof ChildB) {
        //dosomething
    }
}

public void anotherTest(ChildA theChild) {
    //dosomething
}

public ParentB extends ParentA {
}

public Child extends ParentB {
}

public ChildA extends Child {
}

当我测试条件时,我得到以下建议。 Condition "myChild instanceof ChildA" is redundant and can be replaced with "!=null"

为什么我会得到这个建议?建议准确吗?


编辑。

我在条件之前添加了方法。在评论出该方法后,它会删除该建议。是因为它已经尝试将它投射到ChildA并且在那里失败了。因此,ide只是假设它通过那里并且说你可以在那之后检查null?

由于

2 个答案:

答案 0 :(得分:7)

如果myChild不是ChildA的实例(而不是null),则在调用anotherTest()时会收到ClassCastException。

因此,当myChild为null或ChildA的实例且您的instanceof检查是多余的时,您的if块才可以访问。

答案 1 :(得分:1)

案例:

if(obj instanceof MyClass) {...}

if (obj == null) {...}
如果对象不为null,则

在两种情况下都返回false。这是因为空引用不是任何实例。那讲得通。但instanceof根本不是多余的。这是相反的方式。如果需要检查特定对象是否是某个类的实例,则显式检查null是多余的。例如:

if(obj == null) {...} // This check is redundant
else if (obj instanceof MyClass) {...}

因此,建议“ 条件”myChild instanceof ChildA“是多余的,可以替换为”!= null“ ”根本不准确。

Apple apple = new Apple();
Orange orange = new Orange();

这些对象都不为空,也不相互兼容(instanceof)。

if (apple instanceof Orange) {...} // false
if (orange instanceof Apple) {...} // false
if (apple != null) {...} // true: does this mean an apple 'is-an' orange?
if (orange != null) {...} // true: does this mean an orange 'is-an' apple?

结论 :使用instanceof检查对象引用并不是多余的,因为它包含对null的检查。