我正在将Groovy代码库转换为Java而忘记以更改
public static void main(String... args) {
到
public static void main(String args[]) {
并且一直编译和运行项目只是为了感到惊讶只是现在这是合法的Java 8代码。
我理解Java 8 Varargs使函数可以拥有任意数量的参数,“根据它们在方法调用中的位置将它们压缩成一个数组”。
但String... args
和String[] 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,就被调用的方法而言。无论如何,该参数是一个数组
这就是我的问题。对不起,如果被问得不好。
答案 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教程