有没有一种简单的方法可以验证一个对象属于给定类?例如,我可以这样做:
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
但这需要每次实例化一个新对象,然后立即丢弃它。有没有更好的方法来检查"a"是否属于"MyClass"类?
有没有一种简单的方法可以验证一个对象属于给定类?例如,我可以这样做:
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
是正确的。
如果您需要动态执行此操作,可以使用以下内容:
boolean isInstance(Object object, Class<?> type) {
return type.isInstance(object);
}
Object :: getClass
(返回该对象是实例的Class
),或者使用类文字(例如,String.class
,List.class
,int [] .class
)来获取java.lang.Class
的实例。还有其他方式,通过反射API(其中Class
本身是入口点)。我同意已经提到的使用 instanceof
。
使用 instanceof
的另一个好处是,当与 null
引用一起使用时,instanceof
会返回 false
,而 a.getClass()
会抛出 NullPointerException
。
instanceof
运算符来判断。通常的做法是:
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);
a
上调用getClass
,这正是thebackhand试图避免的。 - gdejohnSub
派生自Super
,并且在一个方法中,签名是method(Super super)
,那么如果我评估super isinstanceof Sub
,如果将类型为Sub
的对象作为参数传递给此方法,它会起作用吗? - Aritro Shome