Java 数组参数声明语法 “...”工作?

2022-08-31 17:48:41

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

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

}

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

那么对于那里的专家来说,这是如何运作的呢?它是语法的一部分吗?另外,虽然我可以像这样声明函数,但我不能像这样在函数体中声明数组。

无论如何,您知道任何有记录的地方吗?这是好奇心,也许不值得投入任何时间,但我被难住了。


答案 1

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

public static void main(String... args);
main("this", "is", "multiple", "strings");

与:

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

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


答案 2

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

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

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

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

String[] args