说我有3类,如下所示:
class A {}
class B extends A {}
class C extends A {}
将它然后可能确定特定对象是否是实例A
, B
,或C
?
我认为,这样的事情可能工作:
if (myObject.getClass().isInstance(B.class)) {
// do something for B
} else (myObject.getClass().isInstance(C.class)) {
// do something for C
} else {
// do something for A
}
但看完了一点后,我认为这将始终评估为B,因为它只是测试,如果铸造会工作,并有他们之间没有实质性的区别。
做这个:
if (myObject instanceof B) {
// do something for B
} else (myObject instanceof C) {
// do something for C
} else {
// do something for A
}
更简单的和更快的代码是:
if (myObject instanceof B) {
} else if (myObject instanceof C) {
} else if (myObject instanceof A) {
}
注意顺序很重要:你必须有用于测试A
最后的,因为这会为实例成功B
和C
为好。
然而,你原来的代码将几乎工作。 Class.isInstance
检查值是否真的是给定类或超类的一个实例。 所以,如果myObject
是实例C
,然后B.class.isInstance(myObject)
将返回false。 所有你有错的是你调用getClass()
上myObject
不必要的,而不是使用B.class
等。
这是,如果你不知道你有兴趣的课在编译的时候,你会采取的方法-中instanceof
运算符只能当你可以在代码中静态指定的类型。
现在,如果你想找出是否myObject
是完全的一个实例, B
(而不是一个子类),则只需使用:
if (myObject.getClass() == B.class)
(这将炸毁如果myObject
当然是一个空引用,。)
你也可能想看看双调度成语是根据参数的不支持多语言的方法的类型改变行为的方式OO。
还有就是instanceof
,你想要做什么操作,正如其他人回答。
但要注意,如果你需要这样的事情,这是一个迹象,表明有可能是在你的程序的设计存在缺陷。 的更好,更面向对象的方式来做到这一点是通过使用多态:把一个方法在超类A,覆盖B和C的方法,并呼吁myObject的方法(其应具有类型A):
A myObject = ...; // wherever you get this from
// Override someMethod in class B and C to do the things that are
// specific to those classes
myObject.someMethod();
instanceof
是丑陋的,应该避免尽可能,就像铸造是丑陋的,潜在的危险,应该尽量避免。
你可以这样做
if (myObject.getClass() == B.class) {
// do something for B (not subclasses of b!!!)
} else if(myObject.getClass() == C.class) {
// do something for C (not subclasses of c!!!)
} else if(myobject.getClass() == A.class) {
// do something for A (not subclasses of A!!)
} else if(myobjects instanceof A){
//all other subclasses of A
}