Saya menemukan pertanyaan ini dalam sebuah kuis,
public class MoneyCalc {
public void method(Object o) {
System.out.println("Object Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
Output dari program ini adalah "Versi String". Tetapi saya tidak dapat memahami mengapa meneruskan null ke metode yang kelebihan beban memilih versi string. Apakah null variabel String tidak mengarah ke apa-apa?
Namun ketika kode diubah menjadi,
public class MoneyCalc {
public void method(StringBuffer sb) {
System.out.println("StringBuffer Verion");
}
public void method(String s) {
System.out.println("String Version");
}
public static void main(String args[]) {
MoneyCalc question = new MoneyCalc();
question.method(null);
}
}
itu memberikan kesalahan kompilasi yang mengatakan "Metode metode (StringBuffer) ambigu untuk jenis MoneyCalc"
java
overloading
zakSyed
sumber
sumber
Jawaban:
Referensi null dapat diubah menjadi ekspresi jenis kelas apa pun. Jadi dalam kasus
String
, ini bagus:The
String
kelebihan disini dipilih karena compiler Java mengambil yang paling spesifik overload, sesuai bagian 15.12.2.5 dari JLS . Khususnya:Dalam kasus kedua, kedua metode masih berlaku, tetapi tidak
String
jugaStringBuffer
lebih spesifik dari yang lain, oleh karena itu metode tidak lebih spesifik dari yang lain, maka kesalahan kompilator.sumber
Object
dapat mengambil jenis apa saja dan membungkusnya dalam sebuahObject
, sedangkan aString
hanya dapat mengambilString
. Dalam hal ini,String
adalah tipe yang lebih spesifik dibandingkan denganObject
tipenya.question.method((String)null)
)Selain itu, JLS 3.10.7 juga menyatakan bahwa "null" adalah nilai literal dari "tipe null". Oleh karena itu ada tipe yang disebut "null".
Kemudian, JLS 4.1 menyatakan bahwa terdapat tipe null yang tidak mungkin untuk mendeklarasikan variabel, tetapi Anda dapat menggunakannya hanya melalui literal null. Kemudian dikatakan:
Mengapa compiler memilih untuk melebarkannya ke String mungkin bisa dijelaskan dengan baik dalam jawaban Jon .
sumber
Anda dapat menetapkan
string
kenull
nilai sehingga berlaku dan agar java dan kebanyakan bahasa pemrograman cocok dengan jenis yang paling dekat dan kemudian ke objek.sumber
Untuk menjawab pertanyaan dalam judul:
null
bukan aString
atau anObject
, tapi referensi ke salah satunya dapat diberikannull
.Saya benar-benar terkejut kode ini bahkan dikompilasi. Saya mencoba sesuatu yang serupa sebelumnya dan saya mendapat kesalahan kompiler yang mengatakan bahwa panggilan itu ambigu.
Namun, dalam kasus ini, tampaknya penyusun memilih metode yang paling rendah dalam rantai makanan. Ini mengasumsikan bahwa Anda menginginkan versi metode yang paling tidak umum untuk membantu Anda.
Saya harus melihat apakah saya dapat menggali contoh di mana saya mendapat kesalahan kompiler dalam skenario yang (tampaknya) persis sama ini, meskipun ...]
EDIT: Saya mengerti. Dalam versi yang saya buat, saya memiliki dua metode kelebihan beban, menerima a
String
danInteger
. Dalam skenario ini, tidak ada parameter "paling spesifik" (seperti dalamObject
danString
), sehingga tidak dapat memilih di antara , tidak seperti di kode Anda.Pertanyaan yang sangat keren!
sumber
Karena tipe String lebih spesifik daripada tipe Object. Katakanlah Anda menambahkan satu metode lagi yang menggunakan tipe Integer.
Kemudian Anda akan mendapatkan kesalahan kompiler yang mengatakan bahwa panggilan tersebut ambigu. Seperti sekarang kami dua metode yang sama-sama spesifik dengan prioritas yang sama.
sumber
Kompiler Java memberikan sebagian besar tipe kelas turunan untuk menetapkan null.
Berikut contoh untuk memahaminya:
keluaran: Kelas B.
di samping itu:
Hasil: Metode fun (C) ambigu untuk tipe MyTest
Semoga dapat membantu memahami kasus ini dengan lebih baik.
sumber
Sumber: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5
Konsep: Metode paling spesifik
Penjelasan: Jika lebih dari satu metode anggota dapat diakses dan berlaku untuk pemanggilan metode, Anda harus memilih salah satu untuk menyediakan deskriptor untuk pengiriman metode run-time. Bahasa pemrograman Java menggunakan aturan bahwa metode yang paling spesifik dipilih. Cobalah mentransmisikan null ke tipe tertentu dan metode yang Anda inginkan akan dipanggil secara otomatis.
sumber
Saya tidak akan mengatakan keduanya. NULL adalah keadaan bukan nilai. Lihat tautan ini untuk info lebih lanjut tentang ini (artikel ini berlaku untuk SQL, tetapi saya pikir ini juga membantu pertanyaan Anda).
sumber
null
adalah nilai yang sangat pasti, sebagaimana didefinisikan dalam JLS.