2010-11-28 23 views
47

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

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

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

回答

123

instanceof关键字,如由其他的答案中描述,通常是你想要的东西。 请记住instanceof也会为true返回超类。

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

因此,例如:

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

在上面的例子中,如果是aX一个实例,但如果是aX一个子类的实例的条件为真。

在比较:

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

instanceof例如,如果aX的实例,或者如果a亚类的X实例的条件为真。

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

4

尝试运营商instanceof

15

使用instanceof操作:

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

如果你需要动态地做到这一点,你可以用下面

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

其中clazzClass一个实例。

+0

或更好,但使用IsAssignableFrom(类) – Chii 2010-11-28 06:05:40

3

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

的使用instanceof的另一个好处是,与null参考instanceof使用时将返回false,而a.getClass()将抛出一个NullPointerException

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本质上是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); 
相关问题