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中文網其他相關文章!