有没有简单的方法来验证对象是否属于给定的类?例如,我可以做
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
但这需要每次动态实例化一个新对象,只是丢弃它。有没有更好的方法来检查“a”属于“MyClass”类?
答案 0 :(得分:155)
其他答案所描述的instanceof
关键字通常是您想要的。
请注意,instanceof
也会为超类返回true
。
如果要查看对象是否是类的直接实例,可以比较该类。您可以通过getClass()
获取实例的类对象。您可以通过ClassName.class
静态访问特定的课程。
例如:
if (a.getClass() == X.class) {
// do something
}
在上面的示例中,如果a
是X
的实例,则条件为真,但如果a
是X
的子类的实例,则不是。< / p>
相比之下:
if (a instanceof X) {
// do something
}
在instanceof
示例中,如果a
是X
的实例,或者a
是子类的实例 X
。
大多数情况下,instanceof
是对的。
答案 1 :(得分:21)
答案 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);