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

时间:2018-01-10 01:42:57

标签: java annotations java-annotations

我有以下注释;

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

    String[] value() default {};
}

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

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

    Info[] value();
}

但我在Info class;

上收到以下编译器错误
  

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

  

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

答案 1 :(得分:0)

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