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

时间:2010-03-09 15:46:46

标签: java subclass instanceof

在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或其他什么?

7 个答案:

答案 0 :(得分:153)

您必须仔细阅读此方法的API。有时你很容易混淆。

它是:

if (B.class.isInstance(view))

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

或:

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

API说明:确定此类对象表示的类或接口是否与指定类所代表的类或接口相同,或者是它们的超类或超接口参数

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

if (view instanceof B)

答案 1 :(得分:24)

if(view instanceof B)

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

答案 2 :(得分:10)

也许我错过了什么,但这还不够:

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

答案 3 :(得分:6)

Class.isAssignableFrom() - 适用于接口。如果您不想这样做,则必须致电getSuperclass()并进行测试,直至到达Object

答案 4 :(得分:2)

反过来说:B.class.isInstance(view)

答案 5 :(得分:1)

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

答案 6 :(得分:-1)

我从未真正使用过此功能,但请尝试view.getClass().getGenericSuperclass()