双支撑初始化器和阵列

时间:2015-03-11 07:40:22

标签: java arrays parameters constructor initializer

我有一个方法,其数组参数如下:

public static void foo(int[] param) {
    // Some code
}

我也可以通过编写

来调用该方法
foo(new int[3]);

通常,我们通过new运算符或双括号初始化器(如{1,2,3})声明和初始化数组。例如,int[] foo = new int[3]; int[] foo = {1, 2, 3};

但是不可能使用双括号初始化程序作为方法的参数。 {}仅适用于创建数组对象。

以下是我的问题:新运算符与{}之间是否存在差异? 如果有,那是什么?

2 个答案:

答案 0 :(得分:17)

作为{}的一部分的int foo[] = {1, 2, 3};被称为大括号初始化,并且是int foo[] = new int[]{1, 2, 3};的快捷方式,因为new int[]可以从左手推断侧。

在第二种情况foo({1, 2, 3});中,没有关于你想要什么的推断可以确定,因为没有提示{1, 2, 3}的含义,所以编译器会抱怨。

当您将其重写为foo(new int[]{1, 2, 3});时,您会告诉编译器{}中的项目代表什么。

编译器不会(并且不会尝试)自动解释{}表达式,直到匹配为止 - 这会导致潜在的歧义。

还有this question,它似乎涵盖了完全相同的基础。

正如@benzonico所提到的,它是language specification的一部分,因为这是一种支持的语法,它不包括在方法的调用中使用它。

答案 1 :(得分:5)

只是为了完成另一个答案,你可以看一下JLS 8 10.6:你可以看到在语法中变量初始化器是一个表达式OR(独占)一个数组初始化器(它不是一个表达式)因此在调用方法时不能使用。)