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