継承されたアノテーション: インターフェイスの除外
Inherited アノテーションを保持するアノテーション タイプにもかかわらず、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() {} } class MyClass extends Flipp implements Foo, Bar {}
リフレクション経由でアノテーションにアクセスする場合:
MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value();
結果は、次のようにあいまいになります。アノテーションの明確な継承パスがありません。それは "baz"、"phleem"、または "flopp" でしょうか?
このような競合を回避し、明確さを維持するために、Java は継承されたアノテーションをインターフェイスから意図的に除外します。インターフェイス メソッドに配置されたアノテーションは、通常、この継承制限のため、実用性が限られています。
以上がJava クラスがインターフェイスからアノテーションを継承しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。