双支撑初始化器和阵列

Ren*_*lee 10 java arrays parameters constructor initializer

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

public static void foo(int[] param) {
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

而且我也可以通过写作来调用方法

foo(new int[3]);
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的问题:新运营商和{}?之间有什么区别吗?如果有,那是什么?

Pet*_*esh 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});你告诉编译器该项目的{}意思是什么.

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

还有这个问题,似乎涵盖了完全相同的理由.

正如@benzonico所提到的,它是语言规范的一部分,因为它是一种受支持的语法,它不包括在方法的调用中使用它.


ben*_*ico 5

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