2011-12-15 102 views
5

我遇到這個問題時正在處理一個問題。爲什麼char轉換爲int類型而不是char轉換爲Java中的Integer

(int)input.charAt(i) //works 
(Integer)input.charAt(i) // Does not work 
// input being a string 

我首先想到的是原始圖像被區別對待,這就是爲什麼這不起作用。但是後來我發現很難理解爲什麼他們首先會有一個Integer Wrapper類。

編輯: 然後有包裝類的優點是什麼?這僅僅是因爲沒有原始存在並且在設計上更多地面向對象?我發現很難理解如何有用。新的懷疑altogetehr。

+2

有趣。我會認爲它可以是自動裝箱的。 – DerMike 2011-12-15 10:44:11

回答

7

你說得對,基元對待不同。下面將工作:

(Integer)(int)input.charAt(i); 

不同的是,當參數爲int(Integer)整數。即使它看起來像它也不是實際的演員。但是如果論點是char,那麼這將是一次強制嘗試;但基元不能轉換爲對象,因此它不起作用。你可以做的是首先投charint - 這個劇組是可以的,因爲兩者都是原始類型 - 然後int可以被裝箱。

當然,char - >Integer拳擊可能已經取得了工作。 「爲什麼不?」是一個很好的問題。對於這種功能來說,可能沒有什麼用處,尤其是當通過稍微更加明確的方式來實現相同的功能時。 (應char - >Long工作過,然後並且char - >Short字符是16位的,所以這將是最直接的?)。

答案編輯:包裝類的好處是,包裹元可以像對象那樣對待:例如存儲在List<Integer>中。 List<int>不起作用,因爲int不是一個對象。所以也許更相關的問題是,什麼是OO語言中的原始非對象?答案在於性能:原語更快,佔用更少的內存。用例決定了對象的方便性還是原語的性能更重要。

2

因爲整數是Object。而char不是。你不能將一個非Object對象轉換爲某個Object。

Infact不能將某些對象轉換爲任何其他類不在該對象的層次結構中的類對象。

例如,你不能做到這一點

Integer g = (Integer) s; 

其中sString對象。

現在爲什麼聊天到int工作,因爲每個字符在java中表示爲unicode,所以你可以認爲它在後端char是int的較小版本。 (int是32位,字符是16位)

+0

確實如此,但我認爲汽車拳擊會發生。 – gizgok 2011-12-15 10:45:22

+0

自動裝箱僅適用於整數。這意味着當你將一個int轉換爲Integer時,你不必進行明確的轉換。 @gizgok – Zohaib 2011-12-15 10:49:22