2014-01-14 1 views
0

у меня есть два Java Class объектов во время выполнения, и я хотел бы, чтобы вычислить минимальный общий супертип, то есть наиболее конкретный класс, который является общим предком обоего моих классовнадтипа классов Java

Часто это будет java.lang.Object, но не всегда. например если у меня есть java.lang.Integer и java.lang.Double как мои два класса, то общий супертип, который я ожидал бы получить, - java.lang.Number.

Какой самый эффективный/канонический способ вычислить это?

+0

Просто из любопытства, для чего вы это сделаете? Заниматься боксом? – JNYRanger

+0

У вас всегда есть 2 класса? –

+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.class или Number.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.

Примечание: Этот код работает только с обычными суперклассами, а не с обычными интерфейсами.

Смежные вопросы