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

在Android应用程序testing套件中,我有一个像这样的类,其中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 } } 

问题是,当遇到一个A对象时,它不计算为“ B实例”。 有没有办法做isSubclassOf什么的?

你必须仔细阅读这个方法的API。 有时你会很容易感到困惑。

它可以是:

 if (B.class.isInstance(view)) 

API说:确定指定的对象 (参数)是否与此类表示的对象(您正在调用该方法的类对象 分配兼容,

要么:

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

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

或(没有反思和推荐):

 if (view instanceof B) 
 if(view instanceof B) 

如果view是B的一个实例或者子类A(或者B的任何子类),这将返回true。

也许我错过了一些东西,但是这不够:

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

Class.isAssignableFrom() – 也适用于接口。 如果你不想这样做,你必须调用getSuperclass()并testing,直到到达Object

B.class.isInstance(view)说: B.class.isInstance(view)

如果存在多态性,例如检查SQLRecoverableException vs 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 ... } 

我从来没有实际使用过,但尝试view.getClass().getGenericSuperclass()