Java 如何使@Documented注释保留泛型信息?

Java 如何使@Documented注释保留泛型信息?,java,generics,annotations,Java,Generics,Annotations,我目前已定义此注释: @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) @Beta public @interface Needs { Class<?>[] value(); } 例如,我不能这样做: @Needs(Map<String, SomeClass>) @需要(地图) 目的是将其记录在案,并保留类似上述的泛型信息。有可能吗?Java语言规范: 如果在注释

我目前已定义此注释:

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Beta
public @interface Needs
{
    Class<?>[] value();
}
例如,我不能这样做:

@Needs(Map<String, SomeClass>)
@需要(地图)

目的是将其记录在案,并保留类似上述的泛型信息。有可能吗?

Java语言规范:

如果在注释类型中声明的方法的返回类型不是以下类型之一,则为编译时错误:基元类型、字符串、类、类的任何参数化调用、枚举类型(§8.9)、注释类型或元素类型为上述类型之一的数组类型(§10)

此限制的原因是注释值是在编译时计算的,并且只存储这些值。因此,这些值不能是任意对象,因为不清楚如何将它们存储在类文件中,以及如何在运行时解组它们

通常的解决方案是嵌套注释技巧:

public @interface Needs {
    Need[] value();
}

public @interface Need {
    String key();
    Class value();
}
然后你可以像这样使用它

@Needs([
    @Need(key = "aKey", value = A.class)
    @Need(key = "anotherKey", value = Another.class)
])

我知道限制;)不过,您的引文中有一句话让我感到不安:“类的任何参数化调用”我理解这是指
Class之类的东西
@Needs([
    @Need(key = "aKey", value = A.class)
    @Need(key = "anotherKey", value = Another.class)
])