ホームページ >Java >&#&チュートリアル >Java インターフェースがアノテーションを継承しないのはなぜですか?

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 11:47:30993ブラウズ

Why Don't Java Interfaces Inherit Annotations?

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

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