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)
调用。