2017-03-31 21 views
-1

我對Java中的Number Wrapper類感到困惑。包裝類中的隱式轉換

這兩個分配看起來是對稱的 - char分配給Integer,而int分配給Character。然而,第一項任務

Integer i = 'a'; 

給出編譯錯誤,而第二次分配

Character ch2 = 97; 

是允許的。爲什麼?

+0

您如何期望編譯器能夠將a''轉換爲整數值? – ericbn

+0

@ericbn [像這樣](http://ideone.com/jvaWzh)實質上,OP使用''a'作爲寫'97'的不同方式。這個問題出奇的棘手。 – dasblinkenlight

+0

@Sotirios Delimanolis這不是重複的。 – Mathur

回答

5

雖然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),所以它把97char,不int,並允許拳擊轉換。嘗試使用超出範圍的常量會產生一個錯誤:

Character ch3 = 65536; // error: incompatible types: int cannot be converted to Character 
+0

非常感謝您的解釋 – Mathur

+0

哦,那些頂級1%的人,總是在竊取我們的聲譽;-) ......但是,您首先想到了它;-) ......可能那閃爍的光芒與您同在!如果你允許這個問題:你的暱稱來自哪裏? – GhostCat

+0

@GhostCat它來自[這個互聯網前的meme](https://en.wikipedia.org/wiki/Blinkenlights)在一個略有不同的「翻譯」:「ACHTUNG!Das機器是nicht毛皮gefingerpoken und mittengrabben。易斯特易這是一個很好的例子,它可以幫助你消除所有的傷害,並且可以幫助你恢復健康。「Das rubbernecken sightseeren在das口袋裏守護着雙手,放鬆和吸收das das blinkenlights!」 – dasblinkenlight

3

拳擊轉換的規則可以在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不允許它;而編譯器也沒有這樣做。 ...

0

Integer i = 'a'只是包裝int i ='a'。由於'a'不是int,它會引發錯誤。

同樣,Character ch2 = 97包裝char ch2 = 97。但是,97是一個有效的字符!它代表字符「a」。例如:

System.out.println((char) 97); //Output: a 
0

這是因爲當設置一個字符爲一個整數時,它將返回一個基本爲int的ASCII碼號碼。