Подтвердить что ты не робот

Как проверить, является ли подкласс экземпляром класса во время выполнения?

В наборе тестов приложений для 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 или что-то еще?

4b9b3361

Ответ 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()