Saya mengambil potongan kode ini dari beberapa kuis, menggunakan IDE saya mengeksekusinya dan mendapatkan hasil yang lama, lama tetapi jawaban yang benar adalah Byte, Byte , mengapa saya mendapat hasil yang berbeda? Pertanyaannya terkait dengan JDK 11
public class Client {
static void doCalc(byte... a) {
System.out.print("byte...");
}
static void doCalc(long a, long b) {
System.out.print("long, long");
}
static void doCalc(Byte s1, Byte s2) {
System.out.print("Byte, Byte");
}
public static void main(String[] args) {
byte b = 5;
doCalc(b, b);
}
}
Diedit:
Kode diambil di sini: Tinjauan Sertifikasi Oracle dan Contoh Pertanyaan (Halaman: 13, Pertanyaan: 5)
Byte b = 5;
dengan huruf kapital B.long, long
menggunakan Java8 terlalu FYI ... Tidak yakin mengapa harus jujur, menunggu jawaban juga :)Jawaban:
Jadi, jika Anda pergi melalui spesifikasi bahasa Jawa untuk menentukan tanda tangan metode pada waktu kompilasi, akan menjadi jelas:
Jadi, dari langkah-langkah di atas, jelas bahwa dalam kasus Anda pada kompiler Java fase pertama akan menemukan metode yang cocok yang tidak
doCalc(long a,long b)
. Metode AndadoCalc(Byte s1, Byte s2)
membutuhkan autoboxing selama panggilan sehingga kurang mendapat preferensi.sumber
long
menerimabyte
, tampaknya mengikuti konversi primitif pelebaran : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 . Jadi pada dasarnya,+widening -boxing -varargs
maka+widening +boxing -varargs
kemudian+widening +boxing +varargs
.Byte, Byte
?Silakan baca bab JLS tentang konversi .
Apa yang terjadi dalam kasus Anda adalah bahwa selama runtime, JVM memilih untuk melakukan konversi pelebaran
byte -> long
karena ini adalah konversi yang lebih aman karena dijamin tidak menyebabkannyaRuntimeException
.Mengubah dari
byte
menjadiByte
juga disebut tinju dapat mengakibatkan OutOfMemoryError karena JVM harus mengalokasikan objek baru ke tumpukan:Karena itu,
byte -> long
konversi pelebaran yang lebih aman lebih disukai.sumber
byte
menjadiByte
tidak pernah menyebabkanOutOfMemoryException
, karena semua nilaiByte
(-128 - 127) di-cache secara internal. Tetapi mungkin tidak sama dengan jenis lain, sehingga sebagai aturan praktis, pelebaran konversi mendapat prioritas.Untuk menemukan kelebihan beban yang benar, urutannya adalah:
Begitu
b
manaByte
hasilnya akanByte, Byte
.new byte[] { b, b }
hasilnyabyte, byte
.long, long
.Byte, Byte
hasilnya.sumber