2015-08-08 60 views
1

我找的,讓我獲得「最年輕」的一些類的一些超類實現方法的最佳途徑:查找「老三」超類

List<Class<?>>. 

例如:有這樣的設計:

技能

演員

被動

活動

靈氣

OfHealing

通用

即時

祕密

ArrayList<Class<? extends Skill>> array = new ArrayList<Class<? extends Skill>>(); 
array.add(Skill.class); 
array.add(SkillCast.class); 
array.add(SkillActive.class); 
array.add(SkillAura.class); 
array.add(SkillInstant.class); 


public Class<? extends Skill> getYoungestParent(Class<? extends Skill> clazz, List<Class<? extends Skill>> seachIn) 
{ 
    return ...; 
} 

注意,我是陣列掃描不會總是包含例如代表繼承的整體結構。我需要找到最親密的關係。 我也不能存儲這些關係(保持註冊表),因爲系統涉及API和大量的反射。

唯一讓我想到的是isAssignableFrom和isInstance的很多,但我無法用頭腦來包裝頭腦,因爲如何以聰明的方式來做(沒有無限數量的if語句)。沿(不知道您的具體要求)行

+0

解決方案的速寫:爲每個類,調用'superclass',直到你回到'Object'並保持結果在以「Object」開頭的數組或列表中;然後找到兩個類的最低公共超類,只是從列表的開始迭代,而條目是相同的。 –

回答

2

東西

public Class getYoungestParent(Class clazz, Set<Class> set) 
{ 
    if(clazz==null) 
     return Object.class; 
    if(set.contains(clazz)) 
     return clazz; 
    return getYoungestParent(clazz.getSuperclass(), set); 
} 
+0

這是一個非常好的解決方案......我剛剛通過閱讀文檔瞭解了一些內容「返回表示實體的直接超類的類型」 – Pumphouse