继承—是否可以检查一个类是否在java中扩展另一个类而不创建示例?

uqzxnwby  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(289)

我有两个 Class<? extends SomeClass> 变量,通过循环 HashMap ,我们称之为 A ,其中一个作为参数传递,我们将调用 B . 我想看看 B 延伸 A .
所以,根据我目前的理解,我想举一个例子 B (使用 createInstance )检查一下 instanceof . 但这不仅相当慢,而且很麻烦,因为类需要一个空构造函数。看这里和这里,他们讨论的地方 isAssignableFrom 以及 getSuperClass ,但是 isAssignableFrom (根据我在那里读到的)不适用于同一类(someclass.isassignablefrom(someclass)?),并且 getSuperClass 不会爬上树。
有没有办法让我检查一下 B 延伸 A 而不创建 B ?
例如:

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); //false
toiithl6

toiithl61#

是的。通常,检查您认为合适的api(javadoc)类型。在这种情况下,那就是 Class 它自己,幸运的是,它就在那里:

Class<?> a = Integer.class;
Class<?> b = Number.class;
System.out.println(b.isAssignableFrom(a));
System.out.println(b.isAssignableFrom(b));
> true
> true

但是isassignablefrom(从我在那里读到的)不适用于同一个类
你应该在做假设之前先测试一下。很好用。

xsuvu9jc

xsuvu9jc2#

可以递归地对类对象使用getsuperclass方法,直到没有更多的超类:

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());
    }
}

上面的例子将产生

class java.lang.Class
class B
class A
class java.lang.Object
null

相关问题