我有一个方法,其数组参数如下:
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};
。
但是不可能使用双括号初始化程序作为方法的参数。 {}
仅适用于创建数组对象。
以下是我的问题:新运算符与{}
之间是否存在差异?
如果有,那是什么?
答案 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(独占)一个数组初始化器(它不是一个表达式)因此在调用方法时不能使用。)