2011-05-09 47 views
12

我一直認爲以下應該工作。我得到一個對象,我知道它是Class<X>,其中X擴展了一些類Xyz。爲了使它類型安全我想用Class.asSubclass如以下方法:泛型和Class.asSubclass

private Class<? extends Xyz> castToXyzClass(Object o) { 
    final Class<?> resultClass = (Class<?>) o; 
    final Class<? extends Xyz> result = Xyz.class.asSubclass(resultClass); 
    return result; 
} 

然而,在Eclipse中這是行不通的,我看到的唯一的解決方案是一個未經檢查的演員。我敢打賭,上面的代碼必須工作,我已經使用過這樣的事情......不知道這裏有什麼問題。

回答

18

asSubclass()對它所調用的對象進行操作,而不是對它的參數進行操作 - 不是用於什麼,而是讀取得很好。你只需要做到這一點:

final Class<? extends Xyz> result = resultClass.asSubclass(Xyz.class); 
+0

我知道這是非常微不足道的東西.... thx很多。 – maaartinus 2011-05-09 16:35:38

+8

我個人認爲如果它是'resultClass.asSubclassOf(Xyz.class)',它會讀得更好。 – 2011-05-09 16:39:58

9

asSubclass是一個有點混淆的名字,因爲你沒有獲得一個Class對象代表的子類,你獲取被重新輸入到相同類對象反映它是一些父類類的子類。

事實上,這種方法是相當單一的目的(我認爲你已經找到了它)...這是採取原始或通配類,並獲得更好的類型參數與運行檢查。如果您的類型信息中沒有空白,則不需要:

class Super {} 
class Sub extends Super {} 

//... 
Class<Sub> subClass = Sub.class; 

//both work, but the latter introduces a redundant runtime check 
Class<? extends Super> subOfSuper1 = subClass; 
Class<? extends Super> subOfSuper2 = subClass.asSubclass(Super.class);