Как проверить, расширяет ли один класс java другой во время выполнения?

Ответы:

255

Ты ищешь:

Super.class.isAssignableFrom(Sub.class)
Meriton
источник
84

Если вы хотите знать, Classрасширяет ли один другой другой, используйте Class # isAssignableFrom (Class) . Для вашего примера это будет:

if(B.class.isAssignableFrom(A.class)) { ... }

Если вас интересует, относится ли экземпляр к определенному типу, используйте instanceof:

A obj = new A();
if(obj instanceof B) { ... }

Обратите внимание, что они вернутся, trueесли класс / экземпляр является членом иерархии типов и не ограничивает прямые отношения суперкласса / подкласса. Например:

// if A.class extends B.class, and B.class extends C.class
C.class.isAssignableFrom(A.class); // evaluates to true
// ...and...
new A() instanceof C; // evaluates to true

Если вы хотите проверить прямые отношения суперкласса / подкласса, Тим также предоставил ответ .

Роб Хруска
источник
2
Фактически, это B.class.isAssignableFrom (A.class), поскольку он хочет знать, является ли A подклассом B.
меритон
1
Ах да, я это изменю. Обычно это наоборот (B расширяет A).
Роб Хруска
обманул ya ;-p Большое спасибо за подробный ответ; Хотя я принимаю меритон, так как это самый ясный ИМО.
Armand
42

Вы хотите знать, можно ли b назначить из a :

b.isAssignableFrom(a);

Кроме того, если вы хотите знать, что aэто прямой подкласс b:

a.getSuperclass().equals(b);
Тим Стоун
источник
Спасибо за ответ, спасибо за использование aи bза вопрос
Armand