Java 测试'instanceof'是多余的,可以用`!=空`?

Java 测试'instanceof'是多余的,可以用`!=空`?,java,intellij-idea,android-studio,Java,Intellij Idea,Android Studio,在使用intellij的AndroidStudio中,我在代码中得到了以下建议。我想知道为什么会提出这个建议 我有多个Child类继承自ParentB和ParentB继承自ParentA 我有一个条件,需要测试我的ParentB的哪个子类。假设我有4个孩子ChildA,ChildB,ChildC和ChildD。所有这些子项都继承自子项 因此,我有以下几点: public void test(Child myChild) { anotherTest((ChildA)myChild);

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

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

我有一个条件,需要测试我的
ParentB
的哪个子类。假设我有4个孩子
ChildA
ChildB
ChildC
ChildD
。所有这些子项都继承自
子项

因此,我有以下几点:

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
}

当我测试条件时,我得到以下建议<代码>条件“myChild instanceof ChildA”是多余的,可以替换为“!=null”

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


编辑

我在条件之前添加了方法。在评论了这个方法之后,它就取消了这个建议。这是因为它已经尝试将其强制转换为ChildA,并且会在那里失败。所以,ide只是假设它经过那里,然后说你可以在那之后检查null


谢谢

如果myChild不是ChildA的实例(且不为null),那么在调用另一个test()时,您将得到一个ClassCastException

因此,只有当myChild为null或ChildA的实例且instanceof检查为冗余时,才能访问if块。

这种情况:

if(obj instanceof MyClass) {...}

如果对象不为null,则在这两种情况下都返回false。这是因为空引用不是任何对象的实例。这是有道理的。但是
instanceof
一点也不冗余。反之亦然。如果需要检查特定对象是否是某个类的实例,那么显式检查null是多余的。例如:

if(obj == null) {...} // This check is redundant
else if (obj instanceof MyClass) {...}
因此,建议“条件”myChild instanceof ChildA“是多余的,可以用“=空“”一点也不准确

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的检查。

如果您能给我们展示一个简短但完整的示例来演示这个问题,这将非常有帮助。我怀疑这其中有很多不尽人意的地方。这个例子还不完整,例如,
ChildB
缺失,或者您在if-block中正在做什么。这里只是一个猜测,因为我们缺少信息:如果您正在检查
Child
的所有子类,并且始终在块内执行相同的操作,IDE可能会认为,如果
myChild
为空,则唯一不“doSomething”的方法是,请看这里并按照说明进行操作:从代码中提取问题有多难。它应该已经完成之前,你甚至考虑张贴,所以,你现在得到的是人们猜测任何错误,你可以。谢谢。根据我在编辑中的评论,我假设这是正在发生的事情。
Apple apple = new Apple();
Orange orange = new Orange();
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?