2017-08-28 50 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 
相关问题