if(view instanceof B)
在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说:确定指定对象 ((参数))>>是否与this Class表示的对象赋值兼容或:
if (B.class.isAssignableFrom(view.getClass()))
API说:确定由此表示的类或接口是否与specified Class parameter]表示的类或接口相同,或者是该类或接口的超类或超接口。或(不带反射,推荐一个):Class object
if (view instanceof B)
if(view instanceof B)
如果view是B或B的子类(或B的任何子类)的实例,则返回true。
if (view instanceof B) {
// this view is an instance of B
}
反过来说: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!"); } }
if(view instanceof B)
getSuperclass()
try {
// sth may throw exception
....
} catch (Exception e) {
if(SQLException.class.isAssignableFrom(e.getCause().getClass()))
{
// do sth
System.out.println("SQLException occurs!");
}
}