2010-08-19 75 views

回答

9

它可以做到,但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是完全通用和類型安全的,你仍然可以訪問類對象。

編輯:解決的評論

+0

它可能是***。這個答案是錯誤的。檢查解決方案的其他答案。 – 2017-04-07 19:46:05

+0

@AdamArold在我寫答案的時候,我還不知道它,但你是對的。但我仍然不推薦它。我相應地更新了我的答案。 – jqno 2017-04-13 06:40:04

8

你可以在你的構造函數中使用這種伎倆:(見http://www.hibernate.org/328.html

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

但我相信這個代碼僅在類是子類和子類的實例來執行它的工作原理。

+0

我知道這個技巧,並且正在使用DAO類。但這不是我所看到的。爲了使用這個技巧,我想我們必須在源代碼上定義父類的泛型類型的實際值。 GenericDAO UserDAO擴展GenericDAO TanerDiler 2010-08-19 08:59:06

0

這是一個主要問題的話題,因爲它像預期(在複雜的場景expecially)在一定條件下才有效。

但是Xebia發佈了一個good article整件事情。

相關問題