Jika suatu tipe mengimplementasikan dua antarmuka, dan masing-masing interface
mendefinisikan metode yang memiliki tanda tangan yang identik, maka pada dasarnya hanya ada satu metode, dan mereka tidak dapat dibedakan. Jika, katakanlah, kedua metode memiliki tipe pengembalian yang saling bertentangan, maka itu akan menjadi kesalahan kompilasi. Ini adalah aturan umum tentang pewarisan, metode pengesampingan, penyembunyian, dan deklarasi, dan berlaku juga untuk kemungkinan konflik tidak hanya antara 2 interface
metode yang diwariskan , tetapi juga metode interface
dan super class
, atau bahkan hanya konflik karena penghapusan jenis obat generik.
Contoh kompatibilitas
Berikut adalah contoh di mana Anda memiliki interface Gift
, yang memiliki present()
metode (seperti dalam, menyajikan hadiah), dan juga interface Guest
, yang juga memiliki present()
metode (seperti dalam, tamu hadir dan tidak absen).
Presentable johnny
keduanya a Gift
dan a Guest
.
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { void present(); }
interface Presentable extends Gift, Guest { }
public static void main(String[] args) {
Presentable johnny = new Presentable() {
@Override public void present() {
System.out.println("Heeeereee's Johnny!!!");
}
};
johnny.present(); // "Heeeereee's Johnny!!!"
((Gift) johnny).present(); // "Heeeereee's Johnny!!!"
((Guest) johnny).present(); // "Heeeereee's Johnny!!!"
Gift johnnyAsGift = (Gift) johnny;
johnnyAsGift.present(); // "Heeeereee's Johnny!!!"
Guest johnnyAsGuest = (Guest) johnny;
johnnyAsGuest.present(); // "Heeeereee's Johnny!!!"
}
}
Cuplikan di atas mengkompilasi dan menjalankan.
Perhatikan bahwa hanya ada satu yang @Override
diperlukan !!! . Ini karena Gift.present()
dan Guest.present()
" @Override
-equivalent" ( JLS 8.4.2 ).
Dengan demikian, johnny
hanya memiliki satu implementasi dari present()
, dan tidak peduli bagaimana Anda memperlakukan johnny
, apakah sebagai Gift
atau sebagai Guest
, hanya ada satu metode untuk memohon.
Contoh ketidakcocokan
Berikut adalah contoh di mana kedua metode yang diwariskan TIDAK @Override
-setara:
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { boolean present(); }
interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
// "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
// both define present(), but with unrelated return types"
}
Ini lebih lanjut menegaskan bahwa mewarisi anggota dari interface
harus mematuhi aturan umum deklarasi anggota. Di sini kita memiliki Gift
dan Guest
mendefinisikan present()
dengan jenis pengembalian yang tidak kompatibel: satu sama void
lain boolean
. Untuk alasan yang sama bahwa Anda tidak bisa void present()
dan boolean present()
dalam satu tipe, contoh ini menghasilkan kesalahan kompilasi.
Ringkasan
Anda dapat mewarisi metode-metode yang sama @Override
, tunduk pada persyaratan metode override dan persembunyian yang biasa. Karena mereka ADALAH @Override
-setara, efektif hanya ada satu metode untuk melaksanakan, dan dengan demikian tidak ada yang membedakan / memilih dari.
Compiler tidak harus mengidentifikasi metode mana untuk antarmuka yang mana, karena begitu mereka ditentukan- @Override
sama, mereka adalah metode yang sama.
Menyelesaikan potensi ketidakcocokan mungkin merupakan tugas yang rumit, tapi itu masalah lain sama sekali.
Referensi