76

在一个 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吗?

4

7 回答 7

170

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

它是:

if (B.class.isInstance(view))

API 说:确定指定的 Object (参数)是否与该 Class表示的 对象(您正在调用该方法的类对象)赋值兼容

或者:

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

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

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

if (view instanceof B)
于 2010-03-10T08:28:52.707 回答
25
if(view instanceof B)

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

于 2010-03-09T15:49:14.770 回答
10

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

if (view instanceof B) {
    // this view is an instance of B
}
于 2010-03-09T15:49:35.160 回答
7

Class.isAssignableFrom()- 也适用于接口。如果您不希望这样,您将不得不打电话getSuperclass()并测试,直到您到达Object.

于 2010-03-09T15:51:41.827 回答
2

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

于 2010-03-09T15:49:48.903 回答
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
    ...
}
于 2013-07-31T02:16:56.763 回答
-1

我从来没有真正使用过这个,但试试view.getClass().getGenericSuperclass()

于 2010-03-09T15:51:31.260 回答