在Java中检查一个对象是否属于一个类

94

有没有一种简单的方法可以验证一个对象属于给定类?例如,我可以这样做:

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

但这需要每次实例化一个新对象,然后立即丢弃它。有没有更好的方法来检查"a"是否属于"MyClass"类?

6个回答

207

正如其他答案所描述的那样,instanceof关键字通常是您想要的。请注意,instanceof也会返回父类对象的true

如果您想查看一个对象是否是某个类的直接实例,可以比较这两个类。您可以通过getClass()方法获取实例的类对象。您还可以通过ClassName.class静态访问指定的类。

例如:

if (a.getClass() == X.class) {
  // do something
}
在上面的例子中,如果 aX 的一个实例,则条件为真,但如果 aX 的子类的实例,则条件为假。
相比之下:
if (a instanceof X) {
    // do something
  }
instanceof 的示例中,条件为真的情况是 aX 的一个实例,或者 aX 的一个 子类 的实例。

大多数情况下,instanceof 是正确的。


35

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

boolean isInstance(Object object, Class<?> type) {
    return type.isInstance(object);
}

您可以通过调用任何对象的实例方法Object :: getClass(返回该对象是实例的Class),或者使用类文字(例如,String.classList.classint [] .class )来获取java.lang.Class的实例。还有其他方式,通过反射API(其中Class本身是入口点)。

最好的方式是使用 IsAssignableFrom(Class)。 - Chii
1
@Chii 但是这样你需要再次在a上调用getClass,这正是thebackhand试图避免的。 - gdejohn
1
@Chii 这是建立在他预先知道要比较的类的情况下。我的答案是动态执行它。 - gdejohn
这对继承的对象也适用吗?比如说,如果类Sub派生自Super,并且在一个方法中,签名是method(Super super),那么如果我评估super isinstanceof Sub,如果将类型为Sub的对象作为参数传递给此方法,它会起作用吗? - Aritro Shome
如果我正确理解了你的问题,那么是的,这将起作用。您可以使用jshell轻松测试此功能。 - gdejohn
显示剩余2条评论

21

使用instanceof运算符:

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

6

我同意已经提到的使用 instanceof

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


5
尝试使用 instanceof 运算符来判断。

3

通常的做法是:

if (a instanceof A)

然而,有些情况下你无法这样做,例如当泛型参数中的 A 时。由于Java的类型擦除,以下代码将无法编译:
<A> boolean someMethod(Object a) {
    if (a instanceof A)
    ...
}

以下代码不起作用(并且会产生未检查的转换警告):

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

由于在运行时,A 实际上是 Object,因此您无法将其强制转换为 A

这种情况的解决方法是使用 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接