我對Java中的Number Wrapper類感到困惑。包裝類中的隱式轉換
這兩個分配看起來是對稱的 - char
分配給Integer
,而int
分配給Character
。然而,第一項任務
Integer i = 'a';
給出編譯錯誤,而第二次分配
Character ch2 = 97;
是允許的。爲什麼?
我對Java中的Number Wrapper類感到困惑。包裝類中的隱式轉換
這兩個分配看起來是對稱的 - char
分配給Integer
,而int
分配給Character
。然而,第一項任務
Integer i = 'a';
給出編譯錯誤,而第二次分配
Character ch2 = 97;
是允許的。爲什麼?
雖然int i = 'a'
工作正常,但不允許將其轉換爲Integer
,因爲它需要進行裝箱轉換。
Java的裝箱轉換僅被定義八個情況:
boolean
型,將Boolean
byte
型,將Byte
short
型,將Short
char
類型鍵入Character
int
型,將Integer
long
型,將Long
float
型,將Float
double
型,將Double
由於'a'
是char
文字,Java則沒有允許從char
轉換爲Integer
:字符文字始終爲char
。
但是,當你寫
Character ch2 = 97;
Java編譯器看到的是97處於有效範圍char
(即0..65535),所以它把97
爲char
,不int
,並允許拳擊轉換。嘗試使用超出範圍的常量會產生一個錯誤:
Character ch3 = 65536; // error: incompatible types: int cannot be converted to Character
非常感謝您的解釋 – Mathur
哦,那些頂級1%的人,總是在竊取我們的聲譽;-) ......但是,您首先想到了它;-) ......可能那閃爍的光芒與您同在!如果你允許這個問題:你的暱稱來自哪裏? – GhostCat
@GhostCat它來自[這個互聯網前的meme](https://en.wikipedia.org/wiki/Blinkenlights)在一個略有不同的「翻譯」:「ACHTUNG!Das機器是nicht毛皮gefingerpoken und mittengrabben。易斯特易這是一個很好的例子,它可以幫助你消除所有的傷害,並且可以幫助你恢復健康。「Das rubbernecken sightseeren在das口袋裏守護着雙手,放鬆和吸收das das blinkenlights!」 – dasblinkenlight
拳擊轉換的規則可以在Java語言規格可以發現,章5.1.7
Boxing conversion converts expressions of primitive type to corresponding expressions of reference type. Specifically, the following nine conversions are called the boxing conversions:
...其次是從原始類型的引用類型有效轉換列表。
問題是:無論如何,轉換必須發生。
如果你有
int a = '97'
是罰款;因爲這是一個擴大的轉換(JLS中的sectin 5.12)。但是這種情況下
Integer i = '97'
未列爲自動裝箱的「有效」轉換。換句話說:JLS不允許它;而編譯器也沒有這樣做。 ...
Integer i = 'a'
只是包裝int i ='a'
。由於'a'
不是int
,它會引發錯誤。
同樣,Character ch2 = 97
包裝char ch2 = 97
。但是,97
是一個有效的字符!它代表字符「a」。例如:
System.out.println((char) 97); //Output: a
這是因爲當設置一個字符爲一個整數時,它將返回一個基本爲int的ASCII碼號碼。
您如何期望編譯器能夠將a''轉換爲整數值? – ericbn
@ericbn [像這樣](http://ideone.com/jvaWzh)實質上,OP使用''a'作爲寫'97'的不同方式。這個問題出奇的棘手。 – dasblinkenlight
@Sotirios Delimanolis這不是重複的。 – Mathur