2017-08-28 80 views
3

我不明白爲什麼這個代碼不編譯:爲什麼自動裝箱在數組中不起作用?

Object[] arr = new int[3]; 

我不需要這個代碼工作。我只是想了解原因爲什麼自動裝箱在這種情況下不起作用?

+0

int是一種原始的..你需要明確地使用整型包裝.... –

+3

int不是Object的一個實例。您需要使用整數,而不是 –

+0

此外,還要避免使用這些結構與陣列,如果在所有可能的:使用變量類型等於實際的數組類型,如果你不想得到一個'ArrayStoreException'某處的路線。 –

回答

3

拳擊原始類型的實例轉換爲相應的包裝器類型的實例。它不適用於數組類型。

爲什麼?

  • 因爲這就是語言設計者設計Java的方式,以及JLS指定的內容。詳情請見JLS 5.1.7

JLS的作者沒有包括這個決定的解釋。但是,有很多原因。這裏有幾個更明顯的。

  • 效率。將int[]轉換爲Object[]需要訪問並轉換數組的所有元素。這是昂貴的(O(N))...而不是程序員隱藏在語法後面的東西。

  • 拳擊數組必然創建一個新的數組,它本質上與原始數組不同。您將能夠在下面講這個:

    int[] ints = new int[]{1,2,3}; 
    Integer[] arr = ints; // hypothetical boxing of the elements 
    // What does ints.equals(arr) return? 
    
    array[1] = 0; 
    // What does ints[0] contain now? 
    

    相比之下,(真正的)拳擊,如果你比較指針是唯一的區別的值之間拆箱轉換......即使如此,不可靠。

底線是,延長裝箱和拆箱會引入效率和概念性問題,很難解決。

5

this答案Why do we use autoboxing and unboxing in Java?,我會引用要回答你的問題的相關細節:

原始變量沒有以同樣的方式互換,既不 對方,也不要用Object這個 (但不是唯一的原因)的最明顯的原因是它們的尺寸差異。這使得 原始類型在這方面不方便,但我們仍然需要它們在語言(主要歸結爲性能的原因) 。

因此在另一方面,我應該爲你工作是:

Object[] arr = new Integer[3]; 
1

數組是在Java中一個對象作爲每JLS 4.3.1

所以,一個不能分配INT []爲Object [],或者反之亦然,因爲他們是不兼容的類型。

雖然,自動裝箱做工作,爲數組的元素:

int[] a = new int[3]; 
a[0] = new Integer(0); 
a[1] = 1; 
a[2] = new Integer(2); 

System.out.println(a[0]); 
System.out.println(a[1]); 
System.out.println(a[2]); 

輸出:

0 
1 
2 
相關問題