なぜ Java ではインターフェースがアノテーションを継承できないのでしょうか?

Mary-Kate Olsen
リリース: 2024-11-04 10:58:01
オリジナル
1016 人が閲覧しました

Why doesn't Java allow interfaces to inherit annotations?

インターフェイスにおけるアノテーション継承の除外: 意図的な設計決定

Java では、クラスは実装されたインターフェイスからアノテーションを継承しません。この除外は、継承されたアノテーションに関する Java ドキュメントで明示的に言及されています。インターフェイス上のアノテーションは効果がありません。

この決定の背後にある理由は、継承の競合と曖昧さを防ぐためです。次の例を考えてみましょう。

<code class="java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Baz { String value(); }

interface Foo {
    @Baz("baz")
    void doStuff();
}

interface Bar {
    @Baz("phleem")
    void doStuff();
}

class Flipp {
    @Baz("flopp")
    public void doStuff() {}
}

public class MyClass extends Flipp implements Foo, Bar {}</code>
ログイン後にコピー

インターフェイスがアノテーションを継承できる場合、MyClass の doStuff メソッドは 2 つの競合するアノテーション、Foo からの @Baz("baz") と Foo からの @Baz("phleem") を継承します。バー。これにより、システムに曖昧さが生じ、どのアノテーションを適用すべきかが不明確になります。

さらに、実装されたインターフェイスのアノテーションは、多重継承の問題を引き起こす可能性があります。 Java はクラス レベルでの多重継承をサポートしていないため、インターフェイスからのアノテーションの継承を許可すると、実質的に多重継承の形式が作成されます。これにより、さらに複雑なシナリオが発生し、潜在的な競合が発生する可能性があります。

そのため、明確さを維持し、競合を回避し、Java プログラミング言語の実装における潜在的な問題を防ぐために、インターフェイスからアノテーションの継承を除外することが決定されました。

以上がなぜ Java ではインターフェースがアノテーションを継承できないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート