Java 测试'instanceof'是多余的,可以用`!=空`?
在使用intellij的AndroidStudio中,我在代码中得到了以下建议。我想知道为什么会提出这个建议 我有多个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);
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?