Java Arrays.deepEquals对int[]给出错误,但对Integer[]有效
我在EclipseKepler中使用以下程序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)); } } 它给了我一个编译时错误,
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[]
iffS
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
意味着直接超类型。