2012-12-15 124 views
3

下面是此代碼:從原始型隱式轉換爲Object

int[] someArray = {0, 1, 2, 3}; 
//System.out.println(someArray[0].toString()); int cannot be dereferenced 
// creating Object element with use of primitive element fails 
//Object newObject = new Object(someArray[0]); constructor Object in class java.lang.Object cannot be applied to given types; 
for(Object someObject : someArray) 
{ 
    // here int is casted to Object 
    System.out.println(someObject.toString()); // prints 0, 1, 2, 3 
} 

它是如何發生的是原始類型變量(陣列的元件)不能被明確地鑄造在for循環此原語元素到對象,但是以某種方式被鑄造成對象?

+0

有趣的問題。我的猜測是增強的數組foreach循環的工作原理是創建某種內部迭代器類來填充給定的基本類型。即你不是直接在數組上迭代,而是在隱藏的'迭代器'上進行迭代。 – millimoose

+3

你並沒有在你的評論中任何地方投射。 'int x = 5; System.out.println(((Object)x));'一定會正常工作,即使沒有循環。 –

+0

@ThomasJungblut問題是,foreach循環通常不會爲你做這種投射。 – millimoose

回答

5

自1.5,Java編譯器會自動當上下文調用它拆箱基本類型。 (也就是說,一個int被包裝在一個Integer對象中,反之亦然。)發生這種情況時在原始對象變量和對象變量之間分配。 (或鑄造一個原語的一個對象類型)因此,例如,下面的代碼是有效的:

int i = 123; 
Object o = i; 

這同樣適用於所述隱式分配Object someInt = someArray[…],編譯器發出用於foreach循環。

爲什麼someArray[0].toString()不工作的原因是,你並沒有使用someArray[0]一個對象類型的變量或做其他事情會告訴編譯器autobox - 試圖調用的方法在原始根本無法識別作爲發生這種情況的條件之一。

相關問題