首頁  >  文章  >  Java  >  為什麼 Java 類別不從實作的介面繼承註解?

為什麼 Java 類別不從實作的介面繼承註解?

Linda Hamilton
Linda Hamilton原創
2024-11-04 18:18:02513瀏覽

Why Don't Java Classes Inherit Annotations from Implemented Interfaces?

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() 會導致歧義:

  • 應該繼承Foo 的@Baz 註解嗎?
  • 還是應該繼承 Bar 的 @Baz 註解?
  • 還是應該繼承 Flipp 的 @Baz 註解超類別應該被繼承嗎?

為了避免這種衝突,Java 明確不從介面繼承註解。這可以確保註解的繼承層次結構清晰且一致。

如果需要介面註釋,建議明確註釋實作類別方法。這提供了控制應用於每個方法的特定註釋的靈活性。

以上是為什麼 Java 類別不從實作的介面繼承註解?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn