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

Kir*_*ill 5 java types type-conversion

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

 Object[] arr = new int[3];
Run Code Online (Sandbox Code Playgroud)

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

Nam*_*man 6

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

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

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

Object[] arr = new Integer[3];
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 4

装箱将原始类型的实例转换为相应包装类型的实例。

它不适用于数组类型。

为什么?

  • 因为这就是语言设计者设计 Java 的方式,也是 JLS 指定的。详细信息参见JLS 5.1.7

JLS 作者没有对此决定做出解释。然而,有很多原因。以下是一些比较明显的问题。

  • 效率。将 an 转换int[]为 anObject[]需要访问并转换数组的所有元素。这是昂贵的(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?
    
    Run Code Online (Sandbox Code Playgroud)

    相比之下,(真正的)装箱和拆箱在值之间进行转换,只有在比较指针时才能区分这些值……即使这样,也不能可靠地进行区分。

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