检查一个对象是否属于Java中的类
有没有简单的方法来validation一个对象属于给定的类? 例如,我可以做
if(a.getClass() = (new MyClass()).getClass()) { //do something }
但是这需要每次实例化一个新的对象,而只是放弃它。 有没有更好的方法来检查“a”属于“MyClass”类?
正如其他答案所述, instanceof
关键字通常是您想要的。 请记住, instanceof
也会为超类返回true
。
如果你想看一个对象是否是一个类的直接实例,你可以比较这个类。 您可以通过getClass()
获取实例的类对象。 而且你可以通过ClassName.class
静态访问一个特定的类。
举个例子:
if (a.getClass() == X.class) { // do something }
在上面的例子中,如果a
是X
的实例,则条件为真,但是如果a
是X
的子类的实例,则条件为真。
相比下:
if (a instanceof X) { // do something }
例如,如果a
是X
的实例,或者a
是X
的子类的instanceof
,则条件为真。
大多数情况下, instanceof
是对的。
如果您需要dynamic执行此操作,则可以使用以下方法,
if (clazz.isInstance(a)) { // do something }
其中clazz
是Class
一个实例。
使用instanceof
运算符:
if(a instanceof MyClass) { //do something }
尝试运算符instanceof
。
我同意已经提到的instanceof
的使用。
使用instanceof
一个额外的好处是,当使用null
参考时, instanceof
将返回false
,而a.getClass()
会抛出一个NullPointerException
a.getClass()
。
通常的做法是:
if (a instanceof A)
但是,有些情况下你不能这样做,比如当一个generics参数中的A
时。
由于Java的types擦除,以下不会编译:
<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
。
这种情况下的解决scheme是使用一个Class
而不是generics参数:
void someMethod(Object a, Class<A> aClass) { if (aClass.isInstance(a)) { A casted = aClass.cast(a); ... } }
然后你可以调用这个方法:
someMethod(myInstance, MyClass.class); someMethod(myInstance, OtherClass.class);