Saya telah menambahkan tiga metode dengan parameter:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
Ketika saya menelepon doSomething(null)
, maka kompiler melempar kesalahan sebagai metode ambigu . Jadi adalah masalah karena Integer
dan char[]
metode atau Integer
dan Object
metode?
java
oop
null
overloading
Phani
sumber
sumber
Integer
keint
.reference to doSomething is ambiguous
kesalahan.Jawaban:
Java akan selalu mencoba menggunakan versi metode yang paling spesifik dan berlaku yang tersedia (lihat JLS §15.12.2 ).
Object
,char[]
danInteger
semuanya dapat dianggapnull
sebagai nilai yang valid. Oleh karena itu ketiga versi ini dapat diterapkan, jadi Java harus menemukan yang paling spesifik.Karena
Object
merupakan super-typechar[]
, versi array lebih spesifik daripada versi-nyaObject
. Jadi jika hanya dua metode itu ada,char[]
versi akan dipilih.Ketika kedua versi
char[]
danInteger
tersedia, maka keduanya lebih spesifik daripadaObject
tetapi tidak ada yang lebih spesifik dari yang lain, jadi Java tidak dapat memutuskan mana yang akan dipanggil. Dalam hal ini, Anda harus menyebutkan secara eksplisit mana yang ingin Anda panggil dengan melemparkan argumen ke jenis yang sesuai.Perhatikan bahwa dalam praktiknya masalah ini terjadi jauh lebih jarang daripada yang diperkirakan orang. Alasan untuk ini adalah bahwa itu hanya terjadi ketika Anda secara eksplisit memanggil metode dengan
null
atau dengan variabel dari tipe yang agak tidak spesifik (sepertiObject
).Sebaliknya, doa berikut akan sangat jelas:
Meskipun Anda masih memberikan nilainya
null
, Java tahu persis metode mana yang harus dihubungi, karena itu akan memasukkan jenis variabel ke dalam akun.sumber
Setiap pasangan dari ketiga metode ini ambigu dengan sendirinya ketika dipanggil dengan
null
argumen. Karena setiap tipe parameter adalah tipe referensi.Berikut ini adalah tiga cara untuk memanggil satu metode spesifik Anda dengan nol.
Bolehkah saya menyarankan untuk menghapus ambiguitas ini jika Anda benar-benar berencana untuk memanggil metode ini dengan
null
argumen. Desain seperti itu mengundang kesalahan di masa depan.sumber
Integer
-char[]
pasangan yang ambigu, karena dalam dua kasus lain, kompiler Java dapat memilih pilihan yang paling spesifik, seperti yang dijelaskan @ JoachimSauer.null
sebagai parameter. Di bawah prasyarat itu, ketiga pasangan bersifat ambigu. Untuk kasus umum, saya setuju bahwa hanyaInteger - char[]
pasangan yang ambigu.doSomething(null)
untukpublic static void doSomething(String str) { System.out.println("String called"); }
ini akan kembali string disebut.null
adalah nilai yang valid untuk salah satu dari ketiga jenis; jadi kompiler tidak dapat memutuskan fungsi mana yang akan digunakan. Gunakan sesuatu sepertidoSomething((Object)null)
ataudoSomething((Integer)null)
sebagai gantinya.sumber
Setiap kelas di Jawa memperluas kelas Object. Bahkan kelas Integer juga memperluas Object. Oleh karena itu baik Obyek dan Integer dianggap sebagai instance Objek. Jadi ketika Anda melewatkan null sebagai parameter daripada kompiler menjadi bingung bahwa metode objek mana yang dipanggil yaitu Dengan parameter Objek atau parameter Integer karena mereka berdua objek dan referensi mereka bisa nol. Tetapi primitif di java tidak memperluas Object.
sumber
Saya telah mencoba ini dan ketika ada tepat sepasang metode kelebihan beban dan salah satunya memiliki objek tipe parameter maka kompiler akan selalu memilih metode dengan tipe yang lebih spesifik. Tetapi ketika ada lebih dari satu jenis tertentu, maka kompiler melempar kesalahan metode yang ambigu.
Karena ini adalah peristiwa waktu kompilasi, ini hanya dapat terjadi ketika seseorang dengan sengaja mengabaikan nol untuk metode ini. Jika ini dilakukan dengan sengaja maka lebih baik membebani metode ini lagi tanpa parameter atau membuat metode lain sama sekali.
sumber
ada ambiguitas karena doSomething (char [] obj) dan doSomething (Integer obj).
char [] dan Integer keduanya sama-sama superior untuk null itu sebabnya mereka ambigu.
sumber
Outputnya adalah Int yang disebut null dan ambiguitas dengan char [] dan Integer
sumber