有没有简单的方法来验证对象是否属于给定的类?例如,我可以做检查对象是否属于Java中的类
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
但是这需要每次都实例化一个新的对象,只有放弃它。有没有更好的方法来检查“a”是否属于“MyClass”类?
有没有简单的方法来验证对象是否属于给定的类?例如,我可以做检查对象是否属于Java中的类
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
}
在instanceof
例如,如果a
是X
的实例,或者如果a
是亚类的X
实例的条件为真。
大多数情况下,instanceof
是正确的。
尝试运营商instanceof
。
使用instanceof
操作:
if(a instanceof MyClass)
{
//do something
}
我同意使用instanceof
已经提到过。
的使用instanceof
的另一个好处是,与null
参考instanceof
使用时将返回false
,而a.getClass()
将抛出一个NullPointerException
。
通常的方法是:
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);
或更好,但使用IsAssignableFrom(类) – Chii 2010-11-28 06:05:40