【发布时间】:2011-05-16 17:48:32
【问题描述】:
有没有一种简单的方法来验证一个对象是否属于给定的类?例如,我可以这样做
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
但这需要每次都在运行中实例化一个新对象,只是为了丢弃它。有没有更好的方法来检查“a”是否属于“MyClass”类?
【问题讨论】:
标签: java polymorphism
有没有一种简单的方法来验证一个对象是否属于给定的类?例如,我可以这样做
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
但这需要每次都在运行中实例化一个新对象,只是为了丢弃它。有没有更好的方法来检查“a”是否属于“MyClass”类?
【问题讨论】:
标签: java polymorphism
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 来获取java.lang.Class 的实例(返回该对象是其实例的Class),或者您可以使用类文字(例如,@987654326 @、List.class、int[].class)。还有其他方法,通过反射 API(Class 本身就是入口点)。
【讨论】:
a 上调用getClass,这是反手试图避免的。
Sub 派生自Super 并且在一个方法中,签名是method(Super super) 那么如果我评估super isinstanceof Sub,如果Sub 类型的对象作为参数传递给这个方法,它会起作用吗?
使用instanceof 运算符:
if(a instanceof MyClass)
{
//do something
}
【讨论】:
我同意使用已经提到的instanceof。
使用instanceof 的另一个好处是,当与null 引用一起使用时,instanceof 将返回false,而a.getClass() 将抛出NullPointerException。
【讨论】:
试试运营商instanceof。
【讨论】:
通常的方法是:
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);
【讨论】: