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

5
在使用IntelliJ的AndroidStudio中,我的代码出现了以下建议。我想知道为什么会出现这个建议。
我有多个继承自ParentB的Child类和ParentB又继承自ParentA。
我需要测试哪一个ParentB的子类。假设我有4个子类:ChildA,ChildB,ChildC和ChildD。所有这些子类都继承自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 {
}

当我测试这个条件时,我得到了以下建议:条件"myChild instanceof ChildA"是多余的,可以用"!= null"替换

为什么会出现这样的建议?这个建议准确吗?


编辑。

我在条件之前添加了这个方法。在注释掉这个方法后建议消失了。这是因为它已经尝试将其转换为ChildA,并且在那里失败了吗?因此,IDE 假设它已经通过并说您可以在那之后检查 null 吗?

谢谢


6
如果您能展示一个简短但完整的示例来说明问题,那将非常有帮助。我怀疑此问题可能不止表面上看起来的那样。 - Jon Skeet
2
示例仍不完整,例如缺少ChildB或者在if块中你正在做什么。 - Thomas
1
这只是一个猜测,因为我们缺乏信息:如果您正在检查Child的所有子类并且始终在块内执行相同的操作,则IDE可能会发现“不执行某些操作”的唯一方法是如果myChild为空。 - Thomas
1
还不够,请点击这里并按照说明进行操作:http://stackoverflow.com/help/mcve - Thomas
2
从你的代码中提取问题有多难?在考虑发布到SO之前,这应该已经完成了,现在你所做的只是让人们猜测你可能犯了什么错误。 - Jeroen Vannevel
显示剩余2条评论
2个回答

7
如果myChild不是ChildA的实例(且不为null),则在调用anotherTest()时会出现ClassCastException。
因此,当myChild为null或ChildA的实例时,才能进入if块,并且您的instanceof检查是多余的。

谢谢。这正是我在编辑中所做的评论所假设的情况。 - prolink007

2

案例:

if(obj instanceof MyClass) {...}

并且

if (obj == null) {...}

如果对象不为null,两种情况下都返回false。这是因为null引用不是任何实例。这很有道理。但是 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();

这两个对象都不是null,也不兼容(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 的检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接