Как проверить, является ли подкласс экземпляром класса во время выполнения?
В наборе тестов приложений для 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
или что-то еще?
Ответы
Ответ 1
Вы должны внимательно прочитать API для этих методов. Иногда вы можете легко запутаться.
Это либо:
if (B.class.isInstance(view))
API говорит: определяет, что указанный объект (параметр) совместим с назначением с объектом, представленным этим классом (объект класса, вызываемый методом в )
или
if (B.class.isAssignableFrom(view.getClass()))
API говорит: определяет, является ли класс или интерфейс, представленный этим объектом класса, либо тем же, либо суперклассом или суперинтерфейсом класса или интерфейса, представленного указанным классом параметр
или (без отражения и рекомендуемого):
if (view instanceof B)
Ответ 2
if(view instanceof B)
Это вернет true, если view является экземпляром B или подкласса A (или любого подкласса B в этом отношении).
Ответ 3
Возможно, я что-то пропустил, но этого было бы недостаточно:
if (view instanceof B) {
// this view is an instance of B
}
Ответ 4
Class.isAssignableFrom()
- работает и для интерфейсов. Если вы этого не хотите, вам нужно будет вызвать getSuperclass()
и протестировать, пока не достигнете Object
.
Ответ 5
Это наоборот: B.class.isInstance(view)
Ответ 6
Если существует полиморфизм, такой как проверка 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
...
}
Ответ 7
Я никогда не использовал это, но попробую view.getClass().getGenericSuperclass()