6

我有以下注释;

@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课堂上收到以下编译器错误;

容器注解的目标不是该注解目标的子集

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

4

2 回答 2

9

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

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

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

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

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

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

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

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

于 2018-01-10T01:42:56.560 回答
1

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

于 2018-01-10T04:05:09.730 回答