在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
或其他什么?
答案 0 :(得分:153)
您必须仔细阅读此方法的API。有时你很容易混淆。
它是:
if (B.class.isInstance(view))
API说明:确定指定的对象 (参数)是否与此类 所代表的对象分配兼容(您正在调用方法的类对象)
或:
if (B.class.isAssignableFrom(view.getClass()))
API说明:确定此类对象表示的类或接口是否与指定类所代表的类或接口相同,或者是它们的超类或超接口参数强>
或(没有反思和推荐的):
if (view instanceof B)
答案 1 :(得分:24)
if(view instanceof B)
如果view是B的实例或子类A(或者B的任何子类),则返回true。
答案 2 :(得分:10)
也许我错过了什么,但这还不够:
if (view instanceof B) {
// this view is an instance of B
}
答案 3 :(得分:6)
Class.isAssignableFrom()
- 适用于接口。如果您不想这样做,则必须致电getSuperclass()
并进行测试,直至到达Object
。
答案 4 :(得分:2)
反过来说:B.class.isInstance(view)
答案 5 :(得分: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
...
}
答案 6 :(得分:-1)
我从未真正使用过此功能,但请尝试view.getClass().getGenericSuperclass()