java - 如何找到两个非接口(interface)类的最近公共(public)父类(super class)

标签 java inheritance superclass

要找到最近的公共(public)父类(super class),给定两个非接口(interface)类 ab ,我执行以下操作:

static Class<?> findClosestCommonSuper(final Class<?> a, final Class<?> b) {
    Iterator<Class<?>> pathA = pathFromObject(a).iterator();
    Iterator<Class<?>> pathB = pathFromObject(b).iterator();
    Class<?> res = Object.class;
    Class<?> c;
    while (pathA.hasNext() && pathB.hasNext()) {
        if ((c = pathA.next()) == pathB.next())
            res = c;
    }
    return res;
}

pathFromObject()返回 List<Class<?>>代表继承链,从Object.class开始:

static List<Class<?>> pathFromObject(Class<?> cl) {
    List<Class<?>> res = new ArrayList<>();
    while (cl != null) {
        res.add(cl);
        cl = cl.getSuperclass();
    }
    Collections.reverse(res);
    return res;
}

我的问题是:是否存在一些开箱即用的 JDK 解决方案?也许使用类加载器或某些特定功能。或者不需要两次迭代的更好算法。

最佳答案

我认为最简单的实现是这样的

static Class<?> findClosestCommonSuper(Class<?> a, Class<?> b) {
    while (!a.isAssignableFrom(b))
        a = a.getSuperclass();
    return a;
}

关于java - 如何找到两个非接口(interface)类的最近公共(public)父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509590/

相关文章:

java - 如何在请求正文中将可序列化对象的映射作为 JSON 传递

ruby - 在覆盖 super 的同时仍然返回 super 时,如何有条件地执行某些操作?

C++构造函数中父类(super class)的init成员

java - 交换方法中的对象引用

java - 如何在eclipse中将控制台参数传递给应用程序?

java - 如何用java编写二维数组列表?

java - JPA连接继承查询

javascript - KineticJS 的继承模型是如何工作的?

javascript - 访问从基类构造函数调用的重写方法中的私有(private)方法

Java:在父类(super class)方法签名中返回子类