为什么自动装箱在arrays中不起作用?

我不明白为什么这段代码没有编译:

Object[] arr = new int[3]; 

我不需要这段代码。 我只是想了解自动装箱在这种情况下不起作用的原因

Boxing将基本类型的实例转换为相应包装类型的实例。

它不适用于数组类型。

为什么?

  • 因为这是语言设计者设计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? 

    相比之下,(真实的)装箱和拆箱之间的转换只能在比较指针时才能区分……即便如此,也不可靠。

最重要的是,扩展装箱和拆箱会引入难以解决的效率和概念问题。

从这个回答到为什么我们在Java中使用自动装箱和拆箱? ,我会引用你的问题的相关细节来回答:

原始变量不能以相同的方式互换,既不能彼此互换,也不能与Object互换。 最明显的原因(但不是唯一的原因)是它们的尺寸差异。 这使得原始类型在这方面不方便,但我们仍然需要它们的语言(原因主要归结为性能)。

因此,另一方面,对你有用的是:

 Object[] arr = new Integer[3]; 

根据JLS 4.3.1,数组是Java中的对象

因此,不能将int []分配给Object [],反之亦然,因为它们是不兼容的类型。

虽然,自动装箱确实适用于arrays的元素:

 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