2013-07-29 63 views

回答

6

這是不可能的。

註釋的參數必須是編譯時常量值(如字符串,數字常量或類文字,例如User.class),並且通用參數T未在編譯時定義。

此外,如果T是一個類型參數,然後T.class不是在任何情況下有效的Java代碼,因爲一些所謂的類型擦除(見herehere)。如果您需要知道運行時類型參數T的類別,有幾種方法。例如:

class Repository<T> { 
    private final Class<T> type; 
    Repository(Class<T> type) { this.type = type; } 
    T load(int id) { ... can use type here ... } 
} 

此外,一定要檢查谷歌番石榴(見herehere)和/或吉斯(見herehere)。這兩個庫提供了在運行時注入或以其他方式確定T所代表的類的方法,而無需在構造函數中傳遞它。

這些庫所使用的技術基於這樣一個事實:雖然您無法訪問給定Class<?>的類型參數信息,但您可以訪問該類的超類型信息。因此,如果您有abstract class Service<T>並且您有class MyService extends Service<String>,則可以使用Class<MyService>對其調用getGenericSuperclass(),並使用結果獲得值T,即String。這很乏味,容易出錯,所以一定要用庫來爲你做。

1

不可能由於類型擦除。你可以做這樣的事情。

class MyConcreteService extends MyService<String> { 

    @MyAnnotation(String.class) 
    private String myProperty; 
} 

你可以創造一個泛型參數是已知服務的具體實例,然後你可以使用標註爲類是衆所周知的你。是的,這是乏味的一點。