主要功能签名上的Java 8 varargs

时间:2016-04-22 21:09:28

标签: java variadic-functions

我正在将Groovy代码库转换为Java而忘记以更改

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

public static void main(String args[]) {

并且一直编译和运行项目只是为了感到惊讶只是现在这是合法的Java 8代码。

我理解Java 8 Varargs使函数可以拥有任意数量的参数,“根据它们在方法调用中的位置将它们压缩成一个数组”。

String... argsString[] args的功能方式在语法上有所不同:

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

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

那么当从终端抓取参数时,String... args如何与String args[]一样合法?

修改

azurefrog将答案与另一个很好的问题联系起来。我想提一下另一个答案,评论提供了我正在寻找的答案:

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

评论1:有趣。从其他答案/评论来看,我猜这个新的主声明语法是用Java 1.5添加的。那么Java运行时根据你的主方法声明确定是将字符串直接传递给main还是先构建一个数组?

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

这就是我的问题。对不起,如果被问得不好。

2 个答案:

答案 0 :(得分:3)

我相信,自从varargs加入语言以来,这是合法的。默认情况下,显式调用它们的语法不同,但命令行参数不是由其他Java代码传递,而是“神奇地”传递。

JLS 12.1.4指定了这个:

  

方法main必须声明为public,static和void。它必须指定一个形式参数(第8.4.1节),其声明的类型是String数组。因此,可以接受以下任一声明:

A[mid]

答案 1 :(得分:0)

如您所说,在编译时,所有varargs ...都与数组[]交换。

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

请参阅@Louis_Wasserman对JSL报价的回答。

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