Warisan Anotasi dalam Antara Muka Java
Mengapakah kelas Java tidak mewarisi anotasi daripada antara muka yang dilaksanakan? Tingkah laku ini digariskan secara khusus dalam dokumentasi untuk anotasi @Inherited:
Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
Pilihan ini disengajakan, kerana ia menghalang jenis konflik berbilang warisan yang halus. Pertimbangkan contoh berikut:
<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>
Jika anotasi daripada antara muka telah diwarisi, menggunakan MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() akan mengakibatkan kesamaran:
Untuk mengelakkan konflik ini, Java secara eksplisit tidak mewarisi anotasi daripada antara muka. Ini memastikan hierarki warisan untuk anotasi adalah jelas dan konsisten.
Dalam kes di mana anotasi antara muka diingini, adalah disyorkan untuk menganotasi kaedah kelas pelaksana secara eksplisit. Ini memberikan fleksibiliti untuk mengawal anotasi khusus yang digunakan pada setiap kaedah.
Atas ialah kandungan terperinci Mengapa Kelas Java Tidak Mewarisi Anotasi daripada Antara Muka yang Dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!