我在运行时有两个Java Class
对象,我想计算最小的常用超类型,即最具体的类,它是我的两个类的共同祖先
通常,这将是java.lang.Object
,但并非总是如此。例如如果我有java.lang.Integer
和java.lang.Double
作为我的两个类,那么我期望获得的常见超类型是java.lang.Number
。
计算此数据的最有效/规范方法是什么?
答案 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
。
注意:此代码仅适用于常见的超类,而不适用于通用接口。