Jak sprawdzić, czy jedna klasa Java rozszerza inną w czasie wykonywania?

Odpowiedzi:

258

Czy szukasz:

Super.class.isAssignableFrom(Sub.class)
meriton
źródło
85

Jeśli chcesz wiedzieć, czy a Classrozszerza inny, użyj Class # isAssignableFrom (Class) . Na przykład byłoby to:

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

Jeśli interesuje Cię, czy instancja jest określonego typu, użyj instanceof:

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

Zwróć uwagę, że zwrócą one wartość, truejeśli klasa / instancja jest członkiem hierarchii typów i nie ograniczają bezpośrednich relacji nadklasy / podklasy. Na przykład:

// 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

Jeśli chcesz sprawdzić bezpośrednie relacje nadklasy / podklasy, Tim również udzielił odpowiedzi .

Rob Hruska
źródło
2
Właściwie to klasa B. jest przypisywalna z (klasa A.), ponieważ chce wiedzieć, czy A jest podklasą B.
meriton
1
Ach tak, zmienię to. Zwykle przykłady są odwrotne (B rozszerza A).
Rob Hruska
oszukany ;-p Wielkie dzięki za szczegółową odpowiedź; Akceptuję jednak meriton, ponieważ jest to najwyraźniejsza IMO.
Armand
43

Chcesz wiedzieć, czy b można go przypisać z a :

b.isAssignableFrom(a);

Dodatkowo, jeśli chcesz wiedzieć, że ajest to bezpośrednia podklasa b:

a.getSuperclass().equals(b);
Tim Stone
źródło
dzięki za odpowiedź i dzięki za korzystanie ai bz pytania
Armand