Sebepleri oldukça karmaşıktır, ancak hepsi Java Dil Spesifikasyonunun ayrıntılarındadır ( isterseniz ince baskı ).
İlk olarak, JLS 14.11switch
ifadeler hakkında şunları söylüyor :
"Switch ifadesiyle ilişkilendirilen her büyük harf sabiti, switch ifadesinin Expression ( §5.2 ) türüyle uyumlu bir atama olmalıdır ."
Bu, sırasıyla ve 'a'
atanabilir olması gerektiği anlamına gelir .Integer
Byte
Ama bu doğru gelmiyor:
Sen düşünürdüm beri bu 'a'
olmalıdır bir atanabilir Integer
NEDENİYLE char
> - int
atama yasaldır. (Herhangi bir char
değer bir int
.
Sen düşünürdüm beri bu 'a'
olmamalı bir atanabilir Byte
NEDENİYLE char
> - byte
atama yasal DEĞİLDİR. (Çoğu char
değer bir bayta sığmaz.)
Aslında bunların ikisi de doğru değil. Nedenini anlamak için , atama bağlamında izin verilenler hakkında JLS 5.2'nin gerçekte ne olduğunu okumalıyız .
"Atama bağlamları aşağıdakilerden birinin kullanılmasına izin verir :
- bir kimlik dönüşümü (§5.1.1)
- genişleyen ilkel dönüşüm (§5.1.2)
- genişleyen referans dönüşümü (§5.1.5)
- genişleyen bir referans dönüşümü ve ardından kutudan çıkarma dönüşümü
- genişleyen referans dönüşümü ve ardından kutudan çıkarma dönüşümü, ardından genişleyen ilkel dönüşüm
- bir boks dönüşümü (§5.1.7)
- bir boks dönüşümü ve ardından genişleyen referans dönüşümü
- kutudan çıkarma dönüşümü (§5.1.8)
- kutudan çıkarma dönüşümü ve ardından genişleyen ilkel dönüşüm. "
Gitmek için 'a'
için Integer
için, ihtiyacımız 1 genişletmek char
bir değer int
daha sonra boks int
bir etmek Integer
. Ancak, izin verilen dönüşüm kombinasyonlarına bakarsanız, daha geniş bir ilkel dönüşüm ve ardından bir boks dönüşümü yapamazsınız.
Bu nedenle ' 'a'
e Integer
izin verilmez. Bu, ilk durumda derleme hatasını açıklar.
Sen düşünürdüm 'a'
için Byte
izin olduğunu hiç listesinde olmayan ilkel daralması dönüşüm ... içerir çünkü. Aslında değişmez değerler özel bir durumdur. JLS 5.2 şunları söylemeye devam ediyor.
"Ayrıca, ifade, byte, short, char veya int türünde sabit bir ifadeyse ( §15.28 ):
Değişken byte, short veya char tipindeyse ve sabit ifadenin değeri değişken tipinde temsil edilebilirse daraltıcı bir ilkel dönüşüm kullanılabilir.
Değişken türde ise bir boks dönüştürülmesi takip bir daralma ilkel dönüşüm kullanılabilir Byte
, Short
ya da Character
, ve sürekli ifadesinin değeri kısa, tip byte sunulabilen veya karakter sırasıyla ".
Bunlardan ikinci uygulanır 'a'
için Byte
, çünkü:
- bir karakter değişmezi sabit bir ifadedir ve
- değeri
'a'
olan 97
aralık içinde olan, ondalık byte
( -128
kadar +127
).
Bu, ikinci örnekte neden derleme hatası olmadığını açıklar.
1 - Biz kutu edemez 'a'
bir etmek Character
ve sonra genişletmek Character
için Integer
çünkü Character
bir Java alt tür değil Integer
. Genişletme referans dönüşümünü yalnızca kaynak türü hedef türün bir alt türüyse kullanabilirsiniz.