在AndroidStudio中,使用intellij,我在我的代码中得到以下建议。我想知道为什么要提出这个建议。
我有多个Child
类继承自ParentB
,而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 {
}
当我测试条件时,我得到以下建议。 Condition "myChild instanceof ChildA" is redundant and can be replaced with "!=null"
。
为什么我会得到这个建议?建议准确吗?
编辑。
我在条件之前添加了方法。在评论出该方法后,它会删除该建议。是因为它已经尝试将它投射到ChildA
并且在那里失败了。因此,ide只是假设它通过那里并且说你可以在那之后检查null?
由于
答案 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的检查。