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

Repeatable annotation target subset mismatch compiler error

我有以下注释;

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

    String[] value() default {};
}

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

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

    Info[] value();
}

但我在 Info class;

上收到以下编译器错误

target of container annotation is not a subset of target of this annotation

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

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

@Target({ElementType.Type, ElementType.Constructor})
public @interface Info { .. }

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

@Target(ElementType.Type)
public @interface Infos { .. }

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

@Info(..)
@Info(..)
class SomeClass { .. }

另外需要注意的是,你不能在容器注解中添加新的目标类型,因为主注解不包含它作为目标,这将是没有意义的。从那以后;

container class can only contain a subset of main annotation target set.

将注释 @Target(ElementType.TYPE) 添加到 Infos.