Java Arrays.deepEquals对int[]给出错误,但对Integer[]有效

Java Arrays.deepEquals对int[]给出错误,但对Integer[]有效,java,arrays,eclipse,wrapper,autoboxing,Java,Arrays,Eclipse,Wrapper,Autoboxing,我在EclipseKepler中使用以下程序 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)); } } 它给了我一个编译时错误,

我在EclipseKepler中使用以下程序

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[]
作为数组
a
b
的数据类型时,同样的程序运行良好

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

的规则如下,来自Java语言规范,其中
表示超类型

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

  • 如果P是基元类型,则:
    • Object>1p[]
    • Cloneable>1p[]
    • java.io.Serializable>1p[]
其中
>1
表示直接超类型

在这种情况下,
S
Object
,而
T
Integer
,因此,由于
Integer
对象的子类型,因此
Integer[]
对象[]
的子类型,您可以将其用作需要
对象[]
的方法的参数

但是,对于作为原语的
int
Object
int[]
的超类型,因此
int[]
不能用于需要
Object[]
的地方


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

自动装箱适用于诸如
int
(转换为
Integer
)之类的原语,但不适用于数组-类型为
int[]
的对象不会自动升级为
Integer[]

我没有任何具体的资料来解释为什么会选择这种设计,但有两点似乎是相关的:

  • int[]
    已经是一个对象,而自动装箱应用于基本体。自动装箱
    int[]
    (以及其他情况)会使自动装箱的标准变得非常复杂(在某些情况下可能导致意外行为)
  • 自动装箱不是零成本操作。将
    int[]
    装箱到
    Integer[]
    意味着创建一个新数组,然后为数组中的每个元素创建一个新包装器。一般来说,Java试图避免隐式地执行代价高昂的操作

对象
不是
int
的超类。另外,
Integer
int
的包装,但是
Integer[]
不是
int[]
@SotiriosDelimanolis的包装,而是
对象
Integer
的超类。这不适用吗?
整数
是一个
对象
int
是基本的,不是
对象
deepEquals(Object[]a1,Object[]a2)
可以接受作为
对象
子类型的参数。您可以应用
instanceof
check进行验证
int
不是
对象
。检查Liskov替换原理。投票指出
int[]
是一个
对象。我没想到。它清除了很多东西。Java语言规范的链接清除了很多东西。您应该添加
>1
意味着
直接超类型。