Вопрос:

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

java subclass instanceof

121536 просмотра

7 ответа

2052 Репутация автора

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

Автор: iamamused Источник Размещён: 09.03.2010 03:46

Ответы (7)


24 плюса

13140 Репутация автора

if(view instanceof B)

Это вернет true, если view является экземпляром B или подклассом A (или любым подклассом B в этом отношении).

Автор: Kris Размещён: 09.03.2010 03:49

10 плюса

249522 Репутация автора

Может быть, я что-то упустил, но этого было бы недостаточно:

if (view instanceof B) {
    // this view is an instance of B
}
Автор: Joachim Sauer Размещён: 09.03.2010 03:49

2 плюса

21614 Репутация автора

Это наоборот: B.class.isInstance(view)

Автор: nanda Размещён: 09.03.2010 03:49

-1 плюса

2830 Репутация автора

Я никогда не использовал это на самом деле, но попробуйте view.getClass().getGenericSuperclass()

Автор: chama Размещён: 09.03.2010 03:51

6 плюса

305922 Репутация автора

Class.isAssignableFrom()- работает и для интерфейсов. Если вы этого не хотите, вам придется позвонить getSuperclass()и проверить, пока не дойдете Object.

Автор: Michael Borgwardt Размещён: 09.03.2010 03:51

155 плюса

5848 Репутация автора

Решение

Вы должны внимательно прочитать API для этих методов. Иногда вы можете запутаться очень легко.

Это либо:

if (B.class.isInstance(view))

API говорит: Определяет, является ли указанный Объект (параметр) совместимым с назначением с объектом, представленным этим Классом (Объект класса, в котором вы вызываете метод)

или же:

if (B.class.isAssignableFrom(view.getClass()))

API говорит: Определяет, является ли класс или интерфейс, представленный этим объектом Class, тем же самым или является суперклассом или суперинтерфейсом класса или интерфейса, представленного указанным параметром Class

или (без размышлений и рекомендую):

if (view instanceof B)
Автор: Hardcoded Размещён: 10.03.2010 08:28

1 плюс

39 Репутация автора

Если есть полиморфизм, такой как проверка 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
    ...
}
Автор: vientoho Размещён: 31.07.2013 02:16
Вопросы из категории :
32x32