有没有办法确定类是Java中的实例的类型?

Jer*_*gan 1 java oop inheritance class

说我有3个这样的课程:

class A {}
class B extends A {}
class C extends A {}
Run Code Online (Sandbox Code Playgroud)

难道那么有可能确定一个特定的对象是否是他的一个实例A,BC

我认为这样的事情可能有用:

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
}
Run Code Online (Sandbox Code Playgroud)

但是在阅读了一下之后,我认为它总是会评估为B,因为它只是测试一个演员是否有效并且它们之间没有实质性差异.

Jon*_*eet 9

更简单,更快速的代码是:

if (myObject instanceof B) {
} else if (myObject instanceof C) {
} else if (myObject instanceof A) {
}
Run Code Online (Sandbox Code Playgroud)

注意顺序很重要:你必须有用于测试A最后,因为这会为实例成功B,并C为好.

但是,您的原始代码几乎可以正常工作.Class.isInstance检查值是否真的是给定类或任何超类的实例.因此,如果myObject是实例C,则B.class.isInstance(myObject)返回false.所有你有错的是你调用getClass()myObject不必要的,而不是使用B.class等.

如果您在编译时不知道您感兴趣的类,那么这是您将采用的方法 - instanceof只有在您可以在代码中静态指定类型时,运算符才有效.

现在,如果你想知道是否myObject是一个确切 的实例B(而不是一个子类),那么只需使用:

if (myObject.getClass() == B.class)
Run Code Online (Sandbox Code Playgroud)

(myObject当然,如果是空引用,这将会爆炸.)


Naw*_*Man 7

做这个:

if (myObject instanceof B) {
    // do something for B
} else (myObject instanceof C) {
    // do something for C
} else {
    // do something for A
}
Run Code Online (Sandbox Code Playgroud)