如何确定类是否在Java中扩展另一个类?

Iai*_*oat 28 java

在Java中,我如何确定类扩展了哪些类?

public class A{
}

public class B extends A{
}

public class C extends A{
}

public class D{
}

public class E extends B{
}

public class doSomething{

    public void myFunc(Class cls){
         //need to check that cls is a class which extends A
         //i.e. B, C and E but not A or D
    }
}
Run Code Online (Sandbox Code Playgroud)

cls.getSuperClass()做我需要的吗?

Bal*_*usC 54

这种getSuperClass()方法会失败,E因为它的直接超类不是A,但是B.而是使用Class#isAssignableFrom().

public void myFunc(Class cls){
     //need to check that cls is a class which extends A
     //i.e. B, C and E but not A or D

     if (cls != A.class && A.class.isAssignableFrom(cls)) {
         // ...
     }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rst 8

您应该尝试避免类型检查,而是在B,C和E中实现执行所需操作的函数,使A和D版本不执行任何操作,然后在doSomething类中调用该函数.

如果你进行类型检查它不是很容易维护,因为当你添加新类时,你需要更改条件逻辑.

这个问题是类和覆盖是有阻止的.


uck*_*man 5

是的,Class.getSuperclass()正是您所需要的.

Class<?> c = obj.getClass();
System.out.println(c.getSuperclass() == Some.class);
Run Code Online (Sandbox Code Playgroud)

  • 对于E级,我是否必须迭代树? (2认同)
  • @sprocketonline - 是的. (2认同)