2013-07-29 76 views
2

我不明白爲什麼java不加寬然後自動裝箱。Java:加寬和自動裝箱轉換問題

Integer i = (short) 10; 

我認爲下面會發生:

  1. 第一收縮轉換從10short
  2. short然後會擴大到int
  3. int然後自動複製到Integer

相反,它是一個編譯錯誤。

實施例2:

短X = 10;
整數y = x;

這也失敗了。

回答

3

按照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; 
+0

基於JLS 5.1.5,爲什麼我的示例2失敗? – yapkm01

+1

當處理諸如'Short'和'Integer'的包裝對象時,認識到'Short'不是'Integer'是很重要的。一個不會對另一個進行子類化。您在此處引用的轉換(擴展參考轉換)不適用於此處。 – rgettman

+0

哦,是的。我想起來了。擴展參考轉換涉及子類 - 換句話說相關的類。謝謝 – yapkm01

3

這是怎麼回事是鑄造轉換從intshort,然後從shortInteger嘗試的賦值轉換。

分配轉換(§5.2)允許拳擊,然後加寬,但不擴大,然後拳擊。

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

  • 的標識轉換(§5.1.1)

  • 加寬原語轉換(§5.1.2)

  • 擴大參考轉換(§5.1.5)

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

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

+0

爲什麼不int到short然後到int然後只到Integer?不夠聰明? :OP – yapkm01

+0

@ yapkm01這並不是說JVM不夠智能,而是它不被允許。 'short'到'int'是一個擴大的原始轉換,'int'到'Integer'是一個裝箱轉換。分配轉換隻能執行這兩個操作之一,而不能同時執行這兩個操作。 – Jeffrey

0

在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關係,因此會引發編譯錯誤。