可重复注释目标子集不匹配的编译器错误

bur*_*ete 2 java annotations java-annotations

我有以下注释:

@Repeatable(Infos.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.Type, ElementType.Constructor})
public @interface Info {

    String[] value() default {};
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它是可重复的,并且使用的是包装器类Infos

@Retention(RetentionPolicy.RUNTIME)
public @interface Infos {

    Info[] value();
}
Run Code Online (Sandbox Code Playgroud)

但是我在Info类上遇到以下编译器错误;

容器注释的目标不是此注释的目标的子集

此错误的原因和解决方法是什么?

bur*_*ete 5

问题是由于缺少@Target容器注释类的定义Infos,因为它Info具有以下目标;

@Target({ElementType.Type, ElementType.Constructor})
public @interface Info { .. }
Run Code Online (Sandbox Code Playgroud)

这意味着该注释只能放在类型和构造函数上,但是容器类也应该定义一些目标,因为它本身就是注释。由于警告也提到了这一点,因此这组目标应该是原始注释目标的子集。例如;

@Target(ElementType.Type)
public @interface Infos { .. }
Run Code Online (Sandbox Code Playgroud)

这将使我们可以Info 在类型上重复注释,但不能在构造函数上重复注释;

@Info(..)
@Info(..)
class SomeClass { .. }
Run Code Online (Sandbox Code Playgroud)

还应注意,您不能向容器注释中添加新的目标类型,因为主注释不包含它作为目标,所以这将毫无意义。从此以后;

容器类只能包含主要注释目标集的子集。