2

我目前定义了这个注释:

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Beta
public @interface Needs
{
    Class<?>[] value();
}

问题是,虽然我可以做到:

@Needs({SomeClass.class, OtherClass.class})

我不能这样做,例如:

@Needs(Map<String, SomeClass>)

目的是对其进行记录并保留如上所述的泛型信息。可能吗?

4

1 回答 1

2

Java 语言规范写道

如果在注解类型中声明的方法的返回类型不是以下之一,则为编译时错误:原始类型、字符串、类、对 Class 的任何参数化调用、枚举类型(第 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)
])
于 2013-07-13T11:56:44.603 回答