Java インターフェースでのアノテーションの継承
@Inherited アノテーションで示されるアノテーションの継承により、アノテーションをスーパークラスからサブクラスに伝播できます。ただし、このルールの注目すべき例外は、実装されたインターフェイスのアノテーションが実装クラスによって継承されないことです。
@Inherited のドキュメントによると、「このメタアノテーションは、スーパークラスからアノテーションを継承するだけです。アノテーション実装されたインターフェイスには効果がありません。
非継承の理由
この設計上の決定により、クラスが同じ競合するアノテーションを持つ複数のインターフェイスを実装するシナリオでの継承の競合が防止されます。 。次の例を考えてみましょう:
<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 MyClass implements Foo, Bar{}</code>
アノテーションがインターフェイスから継承された場合、どの @Baz 値が MyClass.doStuff() メソッドに関連付けられますか? "baz"、"phleem"、またはその他の何か?
実際的な意味
インターフェイスでのアノテーションの継承は、競合が発生する可能性があるため、一般的ではなく非実用的であると考えられています。複数のインターフェースが競合するアノテーションを指定している場合、適切なアノテーションを決定することが困難になります。スーパークラスのアノテーションに依存するか、依存関係注入フレームワークでのメソッドインターセプトの代替メカニズムを使用することをお勧めします。
以上がJava インターフェースがアノテーションを継承しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。