双括号初始值设定项和数组

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:您可以看到在语法中,变量初始值设定项要么是表达式,要么(不包括)数组初始值设定项(不是一个表达式,因此在调用方法时不能使用)。