Tengo dos Class<? extends SomeClass> , una obtenida del bucle de claves de un HashMap , la llamaremos A , y otra pasada como parámetro, a la que llamaremos B Me gustaría ver si B extiende A .
Entonces, como actualmente entiendo las cosas, haría una instancia de B (usando createInstance ) y verificaría la instanceof de. Pero esto no solo es bastante lento, sino también engorroso, ya que las clases necesitan un constructor vacío. Vea here y here , donde discuten isAssignableFrom y getSuperClass , pero isAssignableFrom (por lo que leí allí) no funciona en la misma clase (¿SomeClass.isAssignableFrom(SomeClass) ?), y getSuperClass no sube por el árbol.
¿Hay alguna manera de verificar si B extiende A sin crear una instancia de B ?
Por ejemplo:
class SomeClass {} class ExtendingClassA extends SomeClass {} class ExtendingClassAB extends ExtendingClassA {} class ExtendingClassB extends SomeClass {} boolean ClassExtendsClass(Class<? extends SomeClass> A,Class<? extends SomeClass> B) { return A.class instanceof B.class; } ClassExtendsClass(SomeClass.class, ExtendingClassA.class); //true ClassExtendsClass(SomeClass.class, ExtendingClassAB.class); //true ClassExtendsClass(SomeClass.class, ExtendingClassB.class); //true ClassExtendsClass(ExtendingClassA.class, ExtendingClassB.class); //falseSí. En general, verifique la API (javadoc) del tipo que crea que sería el lugar adecuado para ello. En este caso, sería la propia Class y, afortunadamente, está ahí :
Class<?> a = Integer.class; Class<?> b = Number.class; System.out.println(b.isAssignableFrom(a)); System.out.println(b.isAssignableFrom(b)); > true > truepero isAssignableFrom (por lo que leí allí) no funciona en la misma clase
Deberías probar eso antes de hacer suposiciones. Funciona bien.
podría usar el método getSuperclass para un objeto de clase de forma recursiva hasta que no tenga más superclases:
class A {} class B extends A {} class C extends B {} public class Main { public static void main(String[] args) { Class clazz = C.class; System.out.println(clazz.getClass()); System.out.println(clazz.getSuperclass()); System.out.println(clazz.getSuperclass().getSuperclass()); System.out.println(clazz.getSuperclass().getSuperclass().getSuperclass()); System.out.println(clazz.getSuperclass().getSuperclass().getSuperclass().getSuperclass()); } }el ejemplo anterior producirá
class java.lang.Class class B class A class java.lang.Object null