双括号初始化和数组

10

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

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};

但是,无法将双括号初始化器作为方法的参数使用。{}仅可用于创建数组对象。

那么,new 运算符和 {}之间有什么区别呢?如果有,是什么?


4
foo (new int[] {1, 2, 3}) 的作用正常。 - Eran
可能是因为{1,2,3}不是一个数组,而只是用于初始化数组的值? - Andrei Nikolaenko
14
请注意:这里展示的内容并不是所谓的“双括号初始化”(double brace initialization)。使用正确术语以避免混淆。 - Jesper
请查看此链接中的“创建、初始化和访问数组”部分:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html。 - dbank
1
你可能想使用可变参数而不是数组参数:void foo(int...params),并使用 foo(1, 2, 3) 进行调用。 - Walter Laan
显示剩余7条评论
2个回答

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所提到的,这是语言规范的一部分,支持这种语法,但不包括在方法调用中使用。

5

为了补充之前的回答,您可以查看JLS 8 10.6:您可以看到在语法中,变量初始化程序可以是表达式或(互斥)数组初始化程序(它不是表达式,因此在调用方法时不能使用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接