Tidak mengkompilasi:
void test(Integer x) {
switch (x) {
case 'a':
}
}
Kompilasi OK:
void test(Byte x) {
switch(x) {
case 'a':
}
}
java
java-8
switch-statement
ali gh
sumber
sumber
'a'
case akan dieksekusi dalam case yaitux
byte97
. (Cobalah jika Anda tidak percaya kepada saya.) Untuk penjelasan sesungguhnya, lihat jawaban saya.Jawaban:
Alasannya agak rumit, tetapi semuanya ada dalam rincian ( cetak halus jika Anda suka) dari Spesifikasi Bahasa Jawa.
Pertama, JLS 14.11 mengatakan yang berikut tentang
switch
pernyataan:Ini berarti bahwa
'a'
perlu ditugaskanInteger
danByte
masing - masing.Tapi itu tidak terdengar benar:
Anda akan berpikir bahwa karena
'a'
harus ditugaskan keInteger
karenachar
->int
tugas adalah sah. (char
Nilai apa pun akan cocok denganint
.)Anda akan berpikir bahwa karena
'a'
TIDAK boleh ditugaskan keByte
karenachar
->byte
tugas TIDAK sah. (Sebagian besarchar
nilai tidak akan masuk ke dalam byte.)Faktanya, tidak ada yang benar. Untuk memahami mengapa, kita perlu membaca apa sebenarnya JLS 5.2 tentang apa yang diperbolehkan dalam konteks penugasan.
Untuk beralih dari
'a'
keInteger
, kita perlu 1 memperluaschar
nilai keint
kotak laluint
keInteger
. Tetapi jika Anda melihat kombinasi konversi yang diizinkan, Anda tidak dapat melakukan konversi primitif pelebaran diikuti oleh konversi tinju.Karenanya
'a'
untukInteger
tidak diperbolehkan. Ini menjelaskan kesalahan kompilasi dalam kasus pertama.Anda akan berpikir bahwa
'a'
untukByte
tidak diizinkan karena itu akan melibatkan konversi penyempitan primitif ... yang tidak ada dalam daftar sama sekali. Padahal, literal adalah kasus khusus. JLS 5.2 selanjutnya mengatakan yang berikut.Yang kedua ini berlaku
'a'
untukByte
, karena:'a'
adalah97
desimal, yang berada dalam jangkauan untukbyte
(-128
untuk+127
).Ini menjelaskan mengapa tidak ada kesalahan kompilasi dalam contoh kedua.
1 - Kita tidak bisa kotak
'a'
untukCharacter
kemudian melebarCharacter
keInteger
karenaCharacter
tidak subtipe JawaInteger
. Anda hanya dapat menggunakan konversi referensi pelebaran jika jenis sumber adalah subtipe dari jenis target.sumber
int
tipe switch? (karenachar -> int
pelebaran primitif yang diizinkan)