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
などを実行する方法はありますか?
このメソッドのAPIを注意深く読む必要があります。時々、非常に簡単に混乱することがあります。
次のいずれかです。
if (B.class.isInstance(view))
APIの説明:specified Object(the parameter)が表されるオブジェクトと代入互換性があるかどうかを判断しますbythis Class(メソッドを呼び出しているクラスオブジェクト)
または:
if (B.class.isAssignableFrom(view.getClass()))
APIによると:このクラスオブジェクトで表されるクラスまたはインターフェイスが、指定されたクラスパラメータ
または(リフレクションなしで推奨されるもの):
if (view instanceof B)
if(view instanceof B)
これは、ビューがBのインスタンスまたはサブクラスA(またはBのサブクラス)である場合にtrueを返します。
たぶん私は何かを見逃していますが、これでは十分ではありません:
if (view instanceof B) {
// this view is an instance of B
}
Class.isAssignableFrom()
-インターフェイスでも機能します。そうしたくない場合は、 getSuperclass()
を呼び出して、Object
に達するまでテストする必要があります。
それは他の方法です:B.class.isInstance(view)
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
...
}