ホームページ  >  記事  >  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。