這可能嗎?註釋上的通用類類型
class MyService<T> {
@MyAnnotation(T.class)
private String myProperty;
}
編譯器不喜歡它。我怎樣才能做到這一點?
UPDATE
我發現我做不到。見Error setting annotation value as Class<?> from a constant, why?。
這可能嗎?註釋上的通用類類型
class MyService<T> {
@MyAnnotation(T.class)
private String myProperty;
}
編譯器不喜歡它。我怎樣才能做到這一點?
UPDATE
我發現我做不到。見Error setting annotation value as Class<?> from a constant, why?。
這是不可能的。
註釋的參數必須是編譯時常量值(如字符串,數字常量或類文字,例如User.class
),並且通用參數T
未在編譯時定義。
此外,如果T
是一個類型參數,然後T.class
不是在任何情況下有效的Java代碼,因爲一些所謂的類型擦除(見here和here)。如果您需要知道運行時類型參數T
的類別,有幾種方法。例如:
class Repository<T> {
private final Class<T> type;
Repository(Class<T> type) { this.type = type; }
T load(int id) { ... can use type here ... }
}
此外,一定要檢查谷歌番石榴(見here和here)和/或吉斯(見here和here)。這兩個庫提供了在運行時注入或以其他方式確定T
所代表的類的方法,而無需在構造函數中傳遞它。
這些庫所使用的技術基於這樣一個事實:雖然您無法訪問給定Class<?>
的類型參數信息,但您可以訪問該類的超類型信息。因此,如果您有abstract class Service<T>
並且您有class MyService extends Service<String>
,則可以使用Class<MyService>
對其調用getGenericSuperclass()
,並使用結果獲得值T
,即String
。這很乏味,容易出錯,所以一定要用庫來爲你做。
即不可能由於類型擦除。你可以做這樣的事情。
class MyConcreteService extends MyService<String> {
@MyAnnotation(String.class)
private String myProperty;
}
你可以創造一個泛型參數是已知服務的具體實例,然後你可以使用標註爲類是衆所周知的你。是的,這是乏味的一點。
試試這個:private T myProperty; – Veera
對不起,我實際上詢問過'T.class'部分。 –