Dengan keluaran Java 8, antara muka Java telah dipertingkatkan dengan banyak, dengan kaedah lalai dan kaedah statik ditambah, membolehkan antara muka mempunyai lebih banyak fungsi dan reka bentuk yang lebih fleksibel. Walau bagaimanapun, penambahbaikan ini juga membawa beberapa masalah dan pepijat. Dalam artikel ini, kami akan meneroka pepijat penambahbaikan antara muka Java 8 dan cara menangani dan mengelakkannya.
1. Ralat dalam penambahbaikan antara muka Java8
1 Konflik kaedah lalai: Dalam Java8, antara muka boleh mempunyai kaedah lalai, dan kaedah ini boleh mempunyai pelaksanaan lalai. Walau bagaimanapun, konflik boleh timbul apabila kelas melaksanakan dua antara muka yang mempunyai kaedah lalai yang sama. Contohnya:
interface A { default void foo() { System.out.println("A's foo"); } } interface B { default void foo() { System.out.println("B's foo"); } } class C implements A, B { // 编译时错误,需要覆盖 foo() 方法 }
Dalam kes ini, pengkompil tidak akan dapat memberitahu kaedah lalai yang harus digunakan, jadi ralat kompilasi akan dihasilkan.
2. Pewarisan kaedah lalai: Apabila kelas melaksanakan antara muka, dan antara muka mewarisi antara muka lain, dan kedua-dua antara muka mempunyai kaedah lalai yang sama, kelas juga mesti melaksanakan kaedah lalai. Contohnya:
interface A { default void foo() { System.out.println("A's foo"); } } interface B extends A { } class C implements B { // 无需实现 foo() 方法,因为 B 继承了 A }
Dalam kes ini, kelas C tidak perlu melaksanakan kaedah foo() kerana antara muka B mewarisi antara muka A, dan antara muka A sudah melaksanakan kaedah foo().
3 Penggunaan kaedah statik: Dalam Java8, antara muka boleh mempunyai kaedah statik. Walau bagaimanapun, kaedah statik hanya boleh dipanggil menggunakan nama antara muka, bukan kelas pelaksanaan atau sub-antara muka. Contohnya:
interface A { static void foo() { System.out.println("A's foo"); } } interface B extends A { } class C implements B { } A.foo(); // 可以调用 B.foo(); // 编译时错误 C.foo(); // 编译时错误
Dalam kes ini, hanya nama antara muka A boleh memanggil kaedah foo().
2. Cara menangani dan mengelakkan ralat dalam penambahbaikan antara muka Java8
1 Menyelesaikan konflik kaedah lalai: Untuk menyelesaikan konflik kaedah lalai, kami boleh menggunakan kata kunci super untuk menentukan kaedah lalai yang hendak digunakan. Contohnya:
interface A { default void foo() { System.out.println("A's foo"); } } interface B { default void foo() { System.out.println("B's foo"); } } class C implements A, B { @Override public void foo() { A.super.foo(); // 使用接口A的默认方法 } }
Dalam kes ini, kelas C melaksanakan antara muka A dan B, tetapi secara eksplisit menentukan untuk menggunakan kaedah lalai antara muka A dengan menggunakan kata kunci super.
2 Elakkan pewarisan kaedah lalai: Untuk mengelakkan pewarisan kaedah lalai, hanya tentukan kaedah abstrak dalam antara muka. Jika anda perlu menambah kaedah lalai pada antara muka, reka bentuknya dengan teliti untuk mengelakkan konflik.
3. Gunakan nama antara muka untuk memanggil kaedah statik: Untuk mengelakkan masalah dengan panggilan kaedah statik, kita harus menggunakan nama antara muka untuk memanggil kaedah statik.
interface A { static void foo() { System.out.println("A's foo"); } } interface B extends A { } class C implements B { } A.foo(); // 可以调用
Dalam kes ini, kita boleh menggunakan nama antara muka A untuk memanggil kaedah statik foo() kerana melaksanakan kelas dan sub-antara muka tidak boleh memanggil kaedah statik.
Ringkasan
Penambahbaikan antara muka Java8 membawa kami fungsi dan fleksibiliti baharu, tetapi ia juga membawa beberapa masalah dan ralat. Untuk mengelakkan kesilapan ini, kita harus mereka bentuk antara muka dan kelas kita dengan teliti dan mengikut amalan terbaik untuk mengendalikannya. Terutama dalam reka bentuk kaedah lalai, kita mesti berfikir dengan teliti untuk mengelakkan konflik dan masalah.
Atas ialah kandungan terperinci Ralat Java: Ralat penambahbaikan antara muka Java8, cara menangani dan mengelakkannya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!