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

问题描述 投票:69回答:7

在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或类似的东西?

java subclass instanceof
7个回答
156
投票

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

是:

if (B.class.isInstance(view))

API说:确定指定对象 ((参数))>>是否与this Class表示的对象赋值兼容或:

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

API说:确定由此

Class object

表示的类或接口是否与specified Class parameter]表示的类或接口相同,或者是该类或接口的超类或超接口。或(不带反射,推荐一个):

if (view instanceof B)

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

也许我想念一些东西,但是不够吗:

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

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

反过来说:getSuperclass()

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

Object

简单地说,

B.class.isInstance(view)

我从未真正使用过,但是尝试try { // sth may throw exception .... } catch (Exception e) { if(SQLException.class.isAssignableFrom(e.getCause().getClass())) { // do sth System.out.println("SQLException occurs!"); } }

24
投票
if(view instanceof B)

10
投票
也许我想念一些东西,但是不够吗:

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

2
投票
反过来说:getSuperclass()

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

-1
投票
我从未真正使用过,但是尝试try { // sth may throw exception .... } catch (Exception e) { if(SQLException.class.isAssignableFrom(e.getCause().getClass())) { // do sth System.out.println("SQLException occurs!"); } }
© www.soinside.com 2019 - 2024. All rights reserved.