如何在运行时检查子类是否是类的实例?
在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()