2017-09-13 167 views
-2

當我嘗試使用autobox i2Byte時沒有錯誤,但是當我做反之亦然時(b1Integer),則會發生錯誤。爲什麼在自動裝箱期間最終字節變量不能轉換爲整數?

 final byte b1 = 1; 
     Integer i1 = b1; //error 

     final int i2 = 1; 
     Byte b2 = i2;// no error 

     byte b3 = 1; 
     int i3 = b3; // no error 
+0

我覺得解釋是[這個答案](https://stackoverflow.com/a/45105159/905488)。我不明白變量是「最終」如何有所作爲。 –

+0

@MickMnemonic'final'在第二個例子中很重要,因爲它使'i2'成爲一個常量表達式。 – Radiodef

+0

@Radiodef,但OP特別詢問第一次轉換,其中'final'是無關緊要的。 –

回答

1

我可以建議你閱讀JLS Sec 5.2,我在我的答案鏈接到您的previous similar question

分配上下文允許使用以下中的一種:

  • 的標識轉換(§5.1.1)

  • 加寬原語轉換(§5.1.2)

  • 擴大參考轉換(§5.1.5)

  • a boxi ng轉換(§5.1.7)可選地接着加寬 參考轉換

  • 開箱轉換(§5.1.8)可選地接着加寬 原始轉換。

...

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

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

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

    • ...

以你的情況下,以相反的順序:

byte b3 = 1; 
    int i3 = b3; // no error 

分配一個byteint僅僅是一個擴大轉換。

final int i2 = 1; 
    Byte b2 = i2;// no error 

這是完全一樣的你前面的問題:你可以指定一個恆定值intByte,只要int的價值融入一個byte

final byte b1 = 1; 
    Integer i1 = b1; //error 

你試圖做一個擴大原語轉換,隨後裝箱轉換。這不是這裏列出的情況之一,所以這是一個錯誤。

您可以用明確拓寬投解決這個問題:

Integer i1 = (int) b1; //ok