这可能吗?
class MyService<T> {
@MyAnnotation(T.class)
private String myProperty;
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢它.我怎样才能做到这一点?
UPDATE
我发现我做不到.请参阅错误设置注释值为常量的Class <?>,为什么?.
这是不可能的.
注释的参数必须是编译时常量值(例如String,数字常量或类文字等User.class),并且T在编译时未定义泛型参数.
此外,如果T是类型参数,那么T.class在任何情况下都不是有效的Java代码,因为称为类型擦除(参见此处和此处).如果您需要知道T运行时类型参数的类是什么,有一些方法.例如:
class Repository<T> {
private final Class<T> type;
Repository(Class<T> type) { this.type = type; }
T load(int id) { ... can use type here ... }
}
Run Code Online (Sandbox Code Playgroud)
此外,请务必查看Google Guava(请参阅此处和此处)和/或Guice(请参阅此处和此处).这两个库提供了注入(或以其他方式确定)T运行时表示的类的方法,而无需在构造函数中传递它.
这些库使用的技术基于以下事实:尽管您无法访问给定类型参数的信息,但您可以访问Class<?>该类的超类型的信息.所以,如果你有,比如说abstract class Service<T>你有class MyService extends Service<String>,你可以使用a Class<MyService>来调用getGenericSuperclass()它并使用结果来获得值T,即String.这很乏味,容易出错,因此请务必使用库来为您完成.