我有在運行時兩個Java Class
對象,我想計算最小公用超類型,即最具體的類,它是我的兩個階級的共同祖先Java類
通常常見的超類型,這將是java.lang.Object
,但並非總是如此。例如如果我有java.lang.Integer
和java.lang.Double
作爲我的兩個類,那麼我期望得到的常見超類型是java.lang.Number
。
什麼是最有效/規範的方式來計算?
我有在運行時兩個Java Class
對象,我想計算最小公用超類型,即最具體的類,它是我的兩個階級的共同祖先Java類
通常常見的超類型,這將是java.lang.Object
,但並非總是如此。例如如果我有java.lang.Integer
和java.lang.Double
作爲我的兩個類,那麼我期望得到的常見超類型是java.lang.Number
。
什麼是最有效/規範的方式來計算?
喜歡的東西:
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.class
或Number.class
?
謝謝 - 這一個很好地解決了我的直接問題(我同意接口將會非常棘手,但那是另一次...) – mikera
剛剛寫到這真的很快,並不確定它適用於更困難的情況。如果沒有,只是評論它不起作用,我會刪除這個答案。
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
。
注意:此代碼只適用於常見的超類,而不是通用接口。
只是出於好奇,你會怎麼做?拳擊? – JNYRanger
你總是有兩堂課嗎? –
@Rohit我經常有超過2,但一般的解決方案2看起來很容易... – mikera