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

Java 双括号初始值设定项和数组,java,arrays,parameters,constructor,initializer,Java,Arrays,Parameters,Constructor,Initializer,我有一个方法具有如下数组参数: public static void foo(int[] param) { // Some code } 我也可以通过如下方式调用该方法 foo(new int[3]); 通常,我们通过新的运算符或双大括号初始值设定项(如{1,2,3})来声明和初始化数组。例如,int[]foo=newint[3]或int[]foo={1,2,3} 但不可能使用双括号初始值设定项作为方法的参数{}仅可用于创建数组对象 我的问题是:新操作符和{}之间有什么区别吗? 如果

我有一个方法具有如下数组参数:

public static void foo(int[] param) {
    // Some code
}
我也可以通过如下方式调用该方法

foo(new int[3]);
通常,我们通过新的运算符或双大括号初始值设定项(如{1,2,3})来声明和初始化数组。例如,
int[]foo=newint[3]
int[]foo={1,2,3}

但不可能使用双括号初始值设定项作为方法的参数<代码>{}
仅可用于创建数组对象

我的问题是:新操作符和
{}
之间有什么区别吗?
如果有,它是什么?

作为
intfoo[]={1,2,3}的一部分的
{}
是所谓的大括号初始化,是
intfoo[]=newint[]{1,2,3}的快捷方式因为可以从左侧推断新的int[]

在第二种情况下,
foo({1,2,3})由于没有关于
{1,2,3}
的含义的提示,因此无法确定您想要什么,因此编译器会抱怨

当您将其重写为
foo(newint[]{1,2,3})时
您告诉编译器
{}
中的项表示什么

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

还有,似乎涵盖了完全相同的领域


正如@benzonico所提到的,这是受支持语法的一部分,它不包括在方法调用中使用的语法。

为了完成另一个答案,您可以看看:您可以看到,在语法中,变量初始值设定项是表达式或(排他)数组初始值设定项(这不是表达式,因此在调用方法时无法使用)。

谢谢你的评论,吓人。这正是我的观点。foo({1,2,3})不起作用…
foo(新int[]{1,2,3})
works@Eran是的,但这里的问题是为什么int[]i={1,2,3};工作但不工作foo({1,2,3});注意:此处显示的不是已知的内容。请使用正确的术语以避免混淆。您可能希望使用var args而不是数组参数:
void foo(int…params)
并使用
foo(1,2,3)
调用。