我有一個參數化類:如何才能學習泛型類的實際類型參數?
class ParameterizedClass<T extends AbstractSomething> {
}
呼籲:
new ParameterizedClass<Something>();
那麼,如何可以通過使用Java的泛型獲得T
實際類型的東西嗎?
我有一個參數化類:如何才能學習泛型類的實際類型參數?
class ParameterizedClass<T extends AbstractSomething> {
}
呼籲:
new ParameterizedClass<Something>();
那麼,如何可以通過使用Java的泛型獲得T
實際類型的東西嗎?
它可以做到,但type erasure可以使它很難。正如其他答案所討論的那樣,您必須創建一個ParameterizedClass
的子類或將T
類型的字段添加到ParameterizedClass
,並且您需要執行的反射代碼是複雜的。
我建議在這種情況下是什麼,是要解決的問題是這樣的:
class ParameterizedClass<T> {
private Class<T> type;
/** Factory method */
public static <T> ParameterizedClass<T> of(Class<T> type) {
return new ParameterizedClass<T>(type);
}
/** Private constructor; use the factory method instead */
private ParameterizedClass(Class<T> type) {
this.type = type;
}
// Do something useful with type
}
由於Java的類型推斷的靜態方法,你可以構造你的類沒有太多額外的樣板:
ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class);
這樣,你的ParameterizedClass
是完全通用和類型安全的,你仍然可以訪問類對象。
編輯:解決的評論
你可以在你的構造函數中使用這種伎倆:(見http://www.hibernate.org/328.html)
Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
但我相信這個代碼僅在類是子類和子類的實例來執行它的工作原理。
我知道這個技巧,並且正在使用DAO類。但這不是我所看到的。爲了使用這個技巧,我想我們必須在源代碼上定義父類的泛型類型的實際值。 GenericDAO
如果你是指從物體本身,你不能。 類型刪除意味着信息丟失。
如果你有場與具體類型參數使用參數化類型,雖然,那信息保留。
參見Angelika Langer's Generics FAQ,特別是section on type erasure。
這是一個主要問題的話題,因爲它像預期(在複雜的場景expecially)在一定條件下才有效。
但是Xebia發佈了一個good article整件事情。
它可能是***。這個答案是錯誤的。檢查解決方案的其他答案。 – 2017-04-07 19:46:05
@AdamArold在我寫答案的時候,我還不知道它,但你是對的。但我仍然不推薦它。我相應地更新了我的答案。 – jqno 2017-04-13 06:40:04