在Java中,标记为
现在,Java 8引入了新的注解
以下是一个示例:
@Inherited
的注解仅在注释类时起作用:
因此,使用请注意,如果注释类型用于注释除类以外的任何内容,则此元注释类型无效。还要注意,此元注释仅导致从超类继承注释; 实现接口上的注释无效。
@Inherited
注解的接口或方法将不会导致实现类/方法也被注解。这样做的原因很可能是,如果类层次结构中有多个注解,则编译器不知道选择哪个注解,如此处所述。现在,Java 8引入了新的注解
@Repeatable
。我认为,对于同时被标记为@Inherited
和@Repeatable
的注解,删除以上限制是很自然的,因为编译器应该能够将冲突的注解添加到@Repeatable
注解中。以下是一个示例:
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@interface RepeatableAnnotations {
RepeatableAnnotation[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Repeatable(RepeatableAnnotations.class)
@interface RepeatableAnnotation {
String value();
}
@RepeatableAnnotation("A")
interface IntefaceA {}
@RepeatableAnnotation("B")
interface IntefaceB {}
@RepeatableAnnotation("C")
@RepeatableAnnotation("D")
public class TestClass implements IntefaceA, IntefaceB {
public static void main(String[] args) {
for (RepeatableAnnotation a : TestClass.class.getAnnotation(RepeatableAnnotations.class).value()) {
System.out.print(a.value());
}
}
}
我本希望输出结果为ABCD
,但实际结果只有CD
(即@Inherited
的表现和Java 8之前一样)。
有没有人知道在Java 8中,@Repeatable
注解的情况下,为什么不取消接口和方法上@Inherited
的限制?是否有克服上述类型层次结构以获得ABCD
输出的任何解决方法?(除了使用反射扫描超级接口以查找注解...)