检查对象是否属于Java中的类

时间:2010-11-28 01:22:13

标签: java polymorphism

有没有简单的方法来验证对象是否属于给定的类?例如,我可以做

if(a.getClass() = (new MyClass()).getClass())
{
    //do something
}

但这需要每次动态实例化一个新对象,只是丢弃它。有没有更好的方法来检查“a”属于“MyClass”类?

6 个答案:

答案 0 :(得分:155)

其他答案所描述的instanceof关键字通常是您想要的。 请注意,instanceof也会为超类返回true

如果要查看对象是否是类的直接实例,可以比较该类。您可以通过getClass()获取实例的类对象。您可以通过ClassName.class静态访问特定的课程。

例如:

if (a.getClass() == X.class) {
  // do something
}

在上面的示例中,如果aX的实例,则条件为真,但如果aX的子类的实例,则不是。< / p>

相比之下:

if (a instanceof X) {
    // do something
  }

instanceof示例中,如果aX的实例,或者a子类的实例 X

大多数情况下,instanceof是对的。

答案 1 :(得分:21)

如果您需要动态执行此操作,可以使用以下内容

if (clazz.isInstance(a)) {
      // do something
}

其中clazzClass的实例。

答案 2 :(得分:16)

使用instanceof运算符:

if(a instanceof MyClass)
{
    //do something
}

答案 3 :(得分:4)

尝试运算符instanceof

答案 4 :(得分:4)

我同意已经提到的instanceof的使用。

使用instanceof的另一个好处是,当null引用instanceof使用时会返回false,而a.getClass()会抛出NullPointerException 1}}。

答案 5 :(得分:2)

通常的方式是:

if (a instanceof A)

但是,有些情况下您无法执行此操作,例如通用参数中的A时。

由于Java的类型擦除,以下内容将无法编译:

<A> boolean someMethod(Object a) {
    if (a instanceof A)
    ...
}

以下内容无效(并会产生unchecked cast警告):

<A> void someMethod(Object a) {
    try {
        A casted = (A)a;    
    } catch (ClassCastException e) {
         ...
    }
}

您无法在运行时强制转换为A,因为在运行时,A基本上是Object

此类案例的解决方案是使用Class而不是通用参数:

void someMethod(Object a, Class<A> aClass) {
    if (aClass.isInstance(a)) {
       A casted = aClass.cast(a);
       ...
    }
}

然后您可以将方法调用为:

someMethod(myInstance, MyClass.class);
someMethod(myInstance, OtherClass.class);