2014-01-14 13 views
0

我有在運行時兩個Java Class對象,我想計算最小公用超類型,即最具體的類,它是我的兩個階級的共同祖先Java類

通常常見的超類型,這將是java.lang.Object,但並非總是如此。例如如果我有java.lang.Integerjava.lang.Double作爲我的兩個類,那麼我期望得到的常見超類型是java.lang.Number

什麼是最有效/規範的方式來計算?

+0

只是出於好奇,你會怎麼做?拳擊? – JNYRanger

+0

你總是有兩堂課嗎? –

+0

@Rohit我經常有超過2,但一般的解決方案2看起來很容易... – mikera

回答

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

應該mostSpecificCommonSupertype(A.class, B.class)Runnable.classNumber.class

+0

謝謝 - 這一個很好地解決了我的直接問題(我同意接口將會非常棘手,但那是另一次...) – mikera

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

注意:此代碼只適用於常見的超類,而不是通用接口。