我不明白爲什麼java不加寬然後自動裝箱。Java:加寬和自動裝箱轉換問題
Integer i = (short) 10;
我認爲下面會發生:
- 第一收縮轉換從
10
到short
。 short
然後會擴大到int
。int
然後自動複製到Integer
。
相反,它是一個編譯錯誤。
實施例2:
短X = 10;
整數y = x;
這也失敗了。
我不明白爲什麼java不加寬然後自動裝箱。Java:加寬和自動裝箱轉換問題
Integer i = (short) 10;
我認爲下面會發生:
10
到short
。short
然後會擴大到int
。int
然後自動複製到Integer
。相反,它是一個編譯錯誤。
實施例2:
短X = 10;
整數y = x;
這也失敗了。
按照JLS, Section 5.2,其與賦值轉換涉及:
分配上下文允許使用以下中的一種:
的標識轉換( §5.1.1)
擴展原始轉換(§5.1.2)
擴展參考轉換(§5.1。5)
裝箱轉換(§5.1.7)任選地隨後進行加寬 引用轉換
取消裝箱轉換(§5.1.8)任選地隨後進行加寬 原始轉換。
它是無法同時施加兩個轉換(擴大原始轉換和裝箱轉換);這裏只能應用一個轉換,所以它必須導致錯誤。
的解決辦法是施放short
回到一個int
(鑄件轉換),這將允許賦值轉換是裝箱轉換:
Integer i = (int) (short) 10;
(或者在這裏,不丟爲了在第一時間short
)
Integer i = 10;
這是怎麼回事是鑄造轉換從int
到short
,然後從short
到Integer
嘗試的賦值轉換。
分配轉換(§5.2)允許拳擊,然後加寬,但不擴大,然後拳擊。
分配上下文允許使用以下中的一種:
的標識轉換(§5.1.1)
加寬原語轉換(§5.1.2)
擴大參考轉換(§5.1.5)
a boxi ng轉換(§5.1.7)可選地接着加寬 參考轉換
開箱轉換(§5.1.8)可選地接着加寬 原始轉換。
在Java它遵循順序爲「自動裝箱,然後擴大」只是無論你正在做 此: INT X = 5; Object obj = x;
或者 此:
INT X = 5; Long l = x;
僅當存在is-a關係時纔會發生擴展。
因此,在應用上面的序列時,第一種情況對於編譯器來說非常有效,因爲int將是自動整形到整數然後分配給對象,即加寬(即先自動裝箱然後加寬),處於Is-A關係。但在第二種情況下,如果int x的autbox爲Integer且賦值爲Long,則不會被允許,不是is-a關係,因此會引發編譯錯誤。
基於JLS 5.1.5,爲什麼我的示例2失敗? – yapkm01
當處理諸如'Short'和'Integer'的包裝對象時,認識到'Short'不是'Integer'是很重要的。一個不會對另一個進行子類化。您在此處引用的轉換(擴展參考轉換)不適用於此處。 – rgettman
哦,是的。我想起來了。擴展參考轉換涉及子類 - 換句話說相關的類。謝謝 – yapkm01