注释上的通用类类型

Jin*_*won 0 java generics

这可能吗?

class MyService<T> {

    @MyAnnotation(T.class)
    private String myProperty;
}
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢它.我怎样才能做到这一点?

UPDATE

我发现我做不到.请参阅错误设置注释值为常量的Class <?>,为什么?.

Bru*_*eis 6

这是不可能的.

注释的参数必须是编译时常量值(例如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.这很乏味,容易出错,因此请务必使用库来为您完成.