我在eclipse开普勒中使用了以下程序
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文档的说法,编译器会自动在原语和包装器类之间进行自动的自动装箱和解压缩,所以它应该在这里工作。但它不起作用。为什么?
发布于 2013-10-26 15:38:52
子类型数组的规则如下,来自Java规范,其中>方法是一个超级类型
如果S和T都是引用类型,则
S[]>T[]当且仅当S>T。 ..。
Object >1 P[]Cloneable >1 P[]java.io.Serializable >1 P[]
其中>1的意思是一个直接的超级类型。
在本例中,S是Object,T是Integer,所以由于Integer是Object的子类型,因此Integer[]是Object[]的子类型,所以可以将它用作期望Object[]的方法的参数。
但是,对于int (它是一个原语),Object是int[]的超级类型,因此不能在需要Object[]的地方使用int[]。
包装类的概念在这里不适用。
发布于 2013-10-26 15:39:27
自动装箱应用于原语,如int (转换为Integer),但不适用于数组-- int[]类型的对象不会自动提升为Integer[]。
我没有任何具体的来源来解释为什么做出这种设计选择,但有几点似乎是相关的:
int[]已经是一个对象,而自动装箱则适用于原语.自动装箱int[] (和其他情况)会使自动装箱的标准变得复杂(在某些情况下可能会导致意外行为)。int[]装箱到Integer[]将意味着创建一个新数组,然后为数组中的每个元素创建一个新的包装器。一般来说,Java试图避免隐式地执行代价高昂的操作。https://stackoverflow.com/questions/19608449
复制相似问题