2014-09-29 44 views
2

請幫我把我的頭圍繞爲什麼這不起作用。 (這不是一個實際的問題,這是對OCPJP考試心理鍛鍊; Tibial。)Java:自動拆箱與鑄造相結合

public class ImplicitConversions { 

Integer iBoxed; 
short sPrimitive = (short)iBoxed; 

} 

//編譯器錯誤:不兼容的類型;需要:簡短,找到:整數

我假設編譯器試圖首先沒有(或之前)取消裝箱,而例如一個算術運算(iBoxed + iBoxed)會首先解除它。因此,可以肯定地說,自動裝箱/取消裝箱在操作順序(一元,算術,關係,邏輯,有條件,賦值)中的位置以及它到底在哪裏?

我一直在閱讀關於在源代碼下的鑄造轉換(以確保我與1.6兼容),但這一個逃避我。謝謝。 http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#20232

+0

您正在使用搶先式數據類型,這是不允許的 – 2014-09-29 15:11:30

+1

@MuhammadRamahy該如何工作? 'Integer'和'Short'之間沒有繼承關係。 'short sPrimitive =(Short)iBoxed;'甚至不會編譯,而'short sPrimitive =(Short)(Object)iBoxed;'編譯時,編譯器的類型檢查被繞過是沒有用的。運行時異常將被拋出。 – 5gon12eder 2014-09-30 00:22:27

+0

你是對的。我不知道我爲什麼這麼說。 – 2014-10-01 11:19:37

回答

2

Integer有一個方法shortValue()。改爲使用此:

short sPrimitive = iBoxed.shortValue(); 
2

自動裝箱/拆箱表達式不能與更寬或更窄範圍的投射結合使用。

但是,您可以雙投的iBoxed變量:

short sPrimitive = (short) (int) iBoxed; 

首先iBoxed變量是自動拆箱到int,然後int轉換爲short