Java 接口中的注解继承
为什么 Java 类不从实现的接口继承注解? @Inherited 注释的文档中专门概述了此行为:
Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
此选择是经过深思熟虑的,因为它可以防止微妙类型的多重继承冲突。考虑以下示例:
<code class="java">@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo { @Baz("baz") void doStuff(); } public interface Bar { @Baz("phleem") void doStuff(); } public class Flipp { @Baz("flopp") public void doStuff() {} } public class MyClass extends Flipp implements Foo, Bar {}</code>
如果继承了接口的注释,则调用 MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() 将导致歧义:
为了避免这种冲突,Java 明确不从接口继承注释。这可以确保注释的继承层次结构清晰且一致。
如果需要接口注释,建议显式注释实现类方法。这提供了控制应用于每个方法的特定注释的灵活性。
以上是为什么 Java 类不从实现的接口继承注释?的详细内容。更多信息请关注PHP中文网其他相关文章!