检查父类的实例而不是子类的最佳方法是什么?

时间:2014-09-02 15:53:18

标签: java inheritance instance core

如果我有一个A类和一个从A扩展的子类B,并且我从某处获得了B的实例bbb,那么最好检查实例bbb实际上不是A。

我能想到的是以下两点。哪个比两个更好或更好?

1)if(!((bbb instanceof A)&&(bbb b of b)))

2)if(bbb.getClass()。getName()!= A.class.getName()){

由于

2 个答案:

答案 0 :(得分:2)

bbb实际上是A的一个实例,因为B扩展了A,因此您的第一个解决方案无法正常工作。

直接比较课程应该符合您的需求:

if (!A.class.equals(bbb.getClass()))

您也可以有不同的想法:

A bbb = ...;
if (bbb instanceof B) {
    // bbb has been instantiated via B or one of B subclasses
} else {
    // bbb has been instantiated via A or one of A subclasses except B
}

答案 1 :(得分:0)

让我们为动物改变A,为鸟改变B

我已经有了Bird的一个实例,它不可能是一个“原始的”动物。由于Bird是一种更具体的动物类型,JAVA不会让你直接将“原始”Animal分配给Bird变量。如果你的意思是反过来(你有一个动物而你想知道它是否真的是一只鸟)你可以使用

if ( bbb instanceof Bird) ...

简而言之,如果你的问题是对的,你可以确定你有一只Bird而不需要检查任何东西。