Java 主函数签名上的 8 个可变参数

Java 8 varargs on main function signature

我正在将 Groovy 代码库转换为 Java 并且 忘记了 更改

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

public static void main(String args[]) {

编译和运行项目一直以来才惊讶直到现在这是合法的Java8代码。

我知道 Java 8 Varargs 使函数可以有任意数量的参数,"compacting them into an Array" 取决于它们在方法调用中的位置。

但是 String... argsString[] args 函数的语法调用方式不同:

void function1 (String[] args) {}
function1({"one", "two", "three"});

void function2 (String... args) {}
function2("one", "two", "three");

那么从终端获取参数时,String... argsString args[] 一样合法吗?


编辑:

azurefrog 将答案链接到另一个很棒的问题。我想提另一个答案,评论提供了我正在寻找的答案:

Why doesn't Java's main use a variable length argument list?

评论 1:有趣。从另一个 answers/comments 来看,我猜这个新的主要声明语法是在 Java 1.5 中添加的。所以Java运行时根据你的main方法声明来决定是将字符串直接传递给main还是先构建数组?

评论2:不会,它总是构建一个数组。 String... args == String[] args,就被调用的方法而言。参数无论如何都是数组

这就是我的疑问。不好意思问的不好。

我相信,自从将可变参数添加到该语言后,它就合法了。当然,调用它们的语法明显不同,但命令行参数不是由其他 Java 代码传入,而是“神奇地”传入。

JLS 12.1.4 指定为:

The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String. Therefore, either of the following declarations is acceptable:

public static void main(String[] args)

public static void main(String... args)

如您所说,在编译时,所有可变参数... 都被数组[] 换出。

因此 java 编译器识别您的可变参数并将它们放入数组中。

请参阅@Louis_Wasserman 对 JSL 引用的回答。

https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html --- Java 教程