Java数组参数声明语法"..."如何工作?

Vir*_*eal 51 java arrays declaration

我已经写了一段时间的java,今天我遇到了以下声明:

public static void main(String... args) {

}
Run Code Online (Sandbox Code Playgroud)

注意数组声明中的"点点点",而不是通常的括号[].显然它有效.事实上,我写了一个小测试,并验证它的工作原理.所以,我拉了java语法,看看这个参数声明的语法在哪里,但没有找到任何东西.

所以对那里的专家来说,这是如何工作的?它是语法的一部分吗?另外,虽然我可以像这样声明函数,但是我不能像这样在函数体内声明一个数组.

无论如何,你知道任何有这个记录的地方.这是好奇心,也许不值得投入任何时间,但我很难过.

Joh*_*hnS 36

我相信这是在Java 1.5中实现的.语法允许您使用逗号分隔的参数列表而不是数组来调用方法.

public static void main(String... args);
main("this", "is", "multiple", "strings");
Run Code Online (Sandbox Code Playgroud)

是相同的:

public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});
Run Code Online (Sandbox Code Playgroud)

http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs html的


hvg*_*des 30

查看Java语言规范,第三版,第8章(类).埋在里面有这个金块:

如果最后一个形式参数是类型为T的变量arity参数,则认为它定义了类型为T []的形式参数.然后该方法是可变的arity方法.否则,它是一种固定的arity方法.变量arity方法的调用可能包含比形式参数更多的实际参数表达式.将评估与变量arity参数之前的形式参数不对应的所有实际参数表达式,并将结果存储到将传递给方法调用的数组中(第15.12.4.2节).

基本上,任何方法调用的最后一个参数都可以T....如果有,则将其转换为T[].

所以基本上,你所拥有的是一种复制更传统的花哨方式

String[] args
Run Code Online (Sandbox Code Playgroud)


Jig*_*shi 22

它是 varargs

简单来说就像ArrayMember一样

public setMembers(Member[] members);
Run Code Online (Sandbox Code Playgroud)

何时使用:

通常在设计API时,最好不要修改参数个数.

标准API的例子是 String.format(String format,Object... args)

另见


fwi*_*tra 7

这就是所谓的varargs语法.在方法体中,您可以读取members参数,因为它是一个数组 - 实际上,它/是/只是一个数组.

然而,神奇的位在调用方法.在varargs引入语法之前,您将调用该方法:

setMembers(new Members[] {member1, member2, member3});
Run Code Online (Sandbox Code Playgroud)

但是,使用新的varargs语法,您不再需要显式创建数组,并且可以传递:

setMembers(member1, member2, member3);
Run Code Online (Sandbox Code Playgroud)

但这确实意味着varargs参数必须是方法中的最后一个参数.因此不允许这样的事情:

void setMembers(Member ... members, String memberType);
Run Code Online (Sandbox Code Playgroud)

总结:这真的是一些语法糖.我不是Java编译器内部工作的专家,但我很确定调用接受varargs参数的方法的方法被重建为构建给定类型数组的方法.