首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrays.deepEquals给出了int[]错误,但适用于Integer[]

Arrays.deepEquals给出了int[]错误,但适用于Integer[]
EN

Stack Overflow用户
提问于 2013-10-26 15:30:44
回答 2查看 924关注 0票数 2

我在eclipse开普勒中使用了以下程序

代码语言:javascript
复制
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文档的说法,编译器会自动在原语和包装器类之间进行自动的自动装箱和解压缩,所以它应该在这里工作。但它不起作用。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-26 15:38:52

子类型数组的规则如下,来自Java规范,其中>方法是一个超级类型

如果S和T都是引用类型,则S[] > T[]当且仅当S > T。 ..。

  • 如果P是一个原语类型,那么:
    • Object >1 P[]
    • Cloneable >1 P[]
    • java.io.Serializable >1 P[]

其中>1的意思是一个直接的超级类型。

在本例中,SObjectTInteger,所以由于IntegerObject的子类型,因此Integer[]Object[]的子类型,所以可以将它用作期望Object[]的方法的参数。

但是,对于int (它是一个原语),Objectint[]的超级类型,因此不能在需要Object[]的地方使用int[]

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

票数 4
EN

Stack Overflow用户

发布于 2013-10-26 15:39:27

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

我没有任何具体的来源来解释为什么做出这种设计选择,但有几点似乎是相关的:

  • int[]已经是一个对象,而自动装箱则适用于原语.自动装箱int[] (和其他情况)会使自动装箱的标准变得复杂(在某些情况下可能会导致意外行为)。
  • 自动装箱不是零成本操作。将int[]装箱到Integer[]将意味着创建一个新数组,然后为数组中的每个元素创建一个新的包装器。一般来说,Java试图避免隐式地执行代价高昂的操作。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19608449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档