2

我在 eclipse Kepler 中使用以下程序

import java.util.Arrays;

public class Mainn {
    public static void main(String[] args) {    
        int[] a = {1, 2};
        int[] b = {1, 2};

        System.out.println(Arrays.deepEquals(a, b));    
    }
}

它给了我一个关于int[]参数不适用于Object[]形式参数的编译时错误。但是当我使用Integer[]而不是int[]作为数组的数据类型ab.

我对此感到困惑。根据Java 文档,编译器会自动在原语和包装类之间自动装箱和拆箱,因此它应该在这里工作。但它不起作用。为什么?

4

2 回答 2

4

子类型化数组的规则如下,来自 Java 语言规范,其中>手段是超类型

如果 S 和 T 都是引用类型,则S[]> T[]iff S> T

...

  • 如果 P 是原始类型,则:
    • Object >1 P[]
    • Cloneable >1 P[]
    • java.io.Serializable >1 P[]

其中>1手段是直接超类型

在这种情况下SisObjectTis Integer,所以因为Integeris 的子类型,Object因此Integer[]是 的子类型Object[],您可以将其用作需要 的方法的参数Object[]

但是, forint是一个原始类型,Object是 of 的超类型,int[]因此int[]不能在Object[]预期 an 的地方使用。

包装类的概念在这里不适用。

于 2013-10-26T15:38:52.730 回答
4

自动装箱适用于int(converted to Integer) 之类的基元,但不适用于数组 - 类型的对象int[]不会自动提升为Integer[]

我没有任何具体的资料来说明为什么做出这种设计选择,但有几点似乎相关:

  • int[]已经是一个对象,而自动装箱适用于基元。自动装箱int[](和其他情况)会使自动装箱的标准显着复杂化(在某些情况下可能导致意外行为)
  • 自动装箱不是零成本操作。装箱意味着创建一个新数组,然后为数组中的每个元素创建一个新包装器int[]Integer[]一般来说,Java 会尽量避免隐式执行代价高昂的操作。
于 2013-10-26T15:39:27.857 回答