2017-09-13 205 views

回答

16

JLS Sec 5.2, "Assignment contexts"(重點煤礦):

此外,如果表達式爲類型字節,短,炭的常量表達式(§15.28),或INT

  • 如果變量的類型是byte,short或char,並且常量表達式的值可以用變量的類型表示,則可以使用縮小基元轉換。

    • 字節和常量表達式的值是在類型字節可表示:
    • 甲基本收縮轉換接着裝箱轉換如果變量的類型是可以被使用。

    • ...

它只是不規範允許long秒。

需要注意的是這裏的第二個項目符號點說,這種情況不論拳擊:分配常數long表達式爲byte變量將同樣失敗:

// Both compiler errors. 
byte primitive = 0L; 
Byte wrapped = 0L; 
+0

我很好奇,爲什麼。這可能與長詞是否是機器語言有關? –

+6

可能主要是因爲'int'是常量值的默認類型,包括表達式,所以會有像'short s = 123'這樣的代碼_lot_,如果沒有使用這樣的縮小轉換,則需要到處。特別是,Java沒有針對類型較窄的文字的語法。另一方面,如果表達式的類型明確地爲'long',因爲'L'已經用於常量或者某個部分是常量,那麼縮小它可能是錯誤的,並且這種情況很少見比'int'情況下,我猜想餘額有利於使其成爲一個錯誤。 – BeeOnRope

+0

還要注意,自動裝箱並沒有太多的關係:同樣的事情適用於純粹的原始類型。這些規則只是擴展到包含添加到盒裝類型時的賦值。 @JonathanRosenne – BeeOnRope

相關問題