【问题标题】:How do I determine if a class extends another class in Java?如何确定一个类是否扩展了 Java 中的另一个类?
【发布时间】:2010-11-04 19:06:50
【问题描述】:

在 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
    }
}

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

【问题讨论】:

    标签: java


    【解决方案1】:

    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)) {
             // ...
         }
    }
    

    【讨论】:

    • 这是迄今为止建议的最佳解决方案,但我要补充一点,尝试这样做有点“代码味道”。您可能想按照 Martin Broadhurst 的建议尝试找到更好的方法。
    • @Justin:我也意识到这一点。不幸的是,参数是Class,并且要求指出A.class 本身不应该通过检查。最好将A 抽象化并应用策略模式,但这需要A具体 实例作为参数,而不是Class<A>。我不确定这将如何影响 OP 设计的残余。也许 OP 有自己的正当理由选择 Class 作为参数。在我们提供更好的设计建议之前,必须进一步明确功能需求。
    • 这是用于实际的业务系统或学校项目吗?
    【解决方案2】:

    你应该尽量避免类型检查,而是在 B、C 和 E 中实现你想要的函数,让 A 和 D 版本什么都不做,然后从你的 doSomething 类中调用该函数。

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

    类和覆盖是要防止的。

    【讨论】:

      【解决方案3】:

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

      Class<?> c = obj.getClass();
      System.out.println(c.getSuperclass() == Some.class);
      

      【讨论】:

      • 你想要 == 还是等于(或者对类对象没有关系)?
      • 对于 E 类,我必须向上迭代树吗?
      【解决方案4】:

      如果您想要编译时检查,可以使用泛型(Java 5 及更高版本):

      public void myFunc(Class<? extends A> cls) {
      }
      

      传入任何不是从 A 继承的类都会产生编译时错误。

      【讨论】:

        猜你喜欢
        • 2014-10-21
        • 2013-04-09
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多