常见的Java类超类型

时间:2014-01-14 18:44:22

标签: java class oop reflection

我在运行时有两个Java Class对象,我想计算最小的常用超类型,即最具体的类,它是我的两个类的共同祖先

通常,这将是java.lang.Object,但并非总是如此。例如如果我有java.lang.Integerjava.lang.Double作为我的两个类,那么我期望获得的常见超类型是java.lang.Number

计算此数据的最有效/规范方法是什么?

2 个答案:

答案 0 :(得分:2)

类似的东西:

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

这假设您对最具体的常见超级感兴趣。最具体的常见超级类型没有很好地定义,因为可能存在几个同样特定的超类型。例如,给定

class A implements Runnable, Number {}
class B implements Runnable, Number {}

应该{​​{1}}是mostSpecificCommonSupertype(A.class, B.class)还是Runnable.class

答案 1 :(得分:1)

只是写得很快,不能确定它适用于更困难的情况。如果没有,只需评论它不起作用,我将删除此答案。

private static Class getCommonSuperclass(final Class clazz1, final Class clazz2, final boolean doSuper){
    final Class c1 = doSuper ? clazz1.getSuperclass() : clazz1;
    final Class c2 = doSuper ? clazz2.getSuperclass() : clazz2;
    if(c1 == null || c2 == null)
        return Object.class;
    if(c1.equals(c2))
        return c1;
    Class result = getCommonSuperclass(c1.getSuperclass(), c2, false);
    if(!result.equals(Object.class))
        return result;
    result = getCommonSuperclass(c1, c2.getSuperclass(), false);
    if(!result.equals(Object.class))
        return result;
    return getCommonSuperclass(c1.getSuperclass(), c2.getSuperclass(), false);
}

public static Class getCommonSuperclass(final Class clazz1, final Class clazz2){
    return getCommonSuperclass(clazz1, clazz2, true);
}

public static void main(String[] args){
    System.out.println(getCommonSuperclass(java.lang.Double.class, java.lang.Integer.class));
}

上面的代码打印class java.lang.Number

注意:此代码仅适用于常见的超类,而不适用于通用接口。