如何在运行时检查子类是否是类的实例?

在一个 android 应用测试套件中,我有一个类像这样的类,其中 B是一个视图:

public class A extends B {
... etc...
}

现在我有一个视图对象列表,它可能包含 A对象,但在这种情况下,我只关心它们是子类还是 B的“实例”。我想做这样的事情:

ArrayList<View> viewList = getViews();
Iterator<View> iterator = viewList.iterator();
while (iterator.hasNext() && viewList != null) {
View view = iterator.next();
if (view.getClass().isInstance(B.class)) {
// this is an instance of B
}
}

问题是,当 if遇到 A对象时,它的计算结果不是“ B的实例”。有办法做 isSubclassOf之类的吗?

145301 次浏览
if(view instanceof B)

如果 view 是 B 的实例或子类 A (或 B 的任何子类) ,则返回 true。

也许我遗漏了什么,但这不就足够了吗:

if (view instanceof B) {
// this view is an instance of B
}

恰恰相反: B.class.isInstance(view)

我从没用过这个,不过试试 view.getClass().getGenericSuperclass()

Class.isAssignableFrom() -也适用于接口。如果你不想这样,你将不得不调用 getSuperclass()和测试,直到你到达 Object

对于这个方法,你必须仔细阅读 API。有时候你很容易混淆。

要么是:

if (B.class.isInstance(view))

API 命令: 确定 指定物件 (参数)是否与 本课程 (正在调用方法的类对象)表示的对象兼容

或:

if (B.class.isAssignableFrom(view.getClass()))

API 说明: 确定由此 类对象表示的类或接口是否与由 指定的类参数表示的类或接口相同,或者是否为其超类或超接口

或(没有思考和推荐的) :

if (view instanceof B)

如果存在多态性,例如检查 SQLRecoverableException 与 SQLException,则可以这样做。

try {
// sth may throw exception
....
} catch (Exception e) {
if(SQLException.class.isAssignableFrom(e.getCause().getClass()))
{
// do sth
System.out.println("SQLException occurs!");
}
}

简单地说,

ChildClass child= new ChildClass();
if(ParentClass.class.isAssignableFrom(child.getClass()))
{
// do sth
...
}