双括号初始值设定项和数组
Double brace initializer and array
我有一个方法有一个像这样的数组参数:
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};
.
但是不可能使用双括号初始化器作为方法的参数。 {}
仅适用于创建数组对象。
我的问题是:新运算符和 {}
之间有什么区别吗?
如果有,那是什么?
作为 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 的一部分,因为这是一种受支持的语法,不包括它在方法调用中的使用。
为了完成另一个答案,您可以看一下 JLS 8 10.6:您可以看到在语法中,变量初始值设定项要么是表达式,要么(不包括)数组初始值设定项(不是一个表达式,因此在调用方法时不能使用)。
我有一个方法有一个像这样的数组参数:
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};
.
但是不可能使用双括号初始化器作为方法的参数。 {}
仅适用于创建数组对象。
我的问题是:新运算符和 {}
之间有什么区别吗?
如果有,那是什么?
作为 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 的一部分,因为这是一种受支持的语法,不包括它在方法调用中的使用。
为了完成另一个答案,您可以看一下 JLS 8 10.6:您可以看到在语法中,变量初始值设定项要么是表达式,要么(不包括)数组初始值设定项(不是一个表达式,因此在调用方法时不能使用)。