web-dev-qa-db-ja.com

実行時にサブクラスがクラスのインスタンスであるかどうかを確認する方法は?

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
    }
}

問題は、ifAオブジェクトに遭遇すると、「Bのインスタンス」と評価されないことです。 isSubclassOfなどを実行する方法はありますか?

68
iamamused

このメソッドのAPIを注意深く読む必要があります。時々、非常に簡単に混乱することがあります。

次のいずれかです。

if (B.class.isInstance(view))

APIの説明:specified Object(the parameter)が表されるオブジェクトと代入互換性があるかどうかを判断しますbythis Class(メソッドを呼び出しているクラスオブジェクト)

または:

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

APIによると:このクラスオブジェクトで表されるクラスまたはインターフェイスが、指定されたクラスパラメータ

または(リフレクションなしで推奨されるもの):

if (view instanceof B)
154
Hardcoded
if(view instanceof B)

これは、ビューがBのインスタンスまたはサブクラスA(またはBのサブクラス)である場合にtrueを返します。

24
Kris

たぶん私は何かを見逃していますが、これでは十分ではありません:

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

Class.isAssignableFrom() -インターフェイスでも機能します。そうしたくない場合は、 getSuperclass() を呼び出して、Objectに達するまでテストする必要があります。

6

それは他の方法です:B.class.isInstance(view)

2
nanda

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
    ...
}
1
vientoho