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 の説明:指定されたオブジェクト (パラメーター)が、このクラス (メソッドを呼び出しているクラス オブジェクト)によって表されるオブジェクトと割り当て互換性があるかどうかを判断

また:

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 に答える