【发布时间】:2016-04-22 21:09:28
【问题描述】:
我正在将 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 将答案链接到另一个很棒的问题。我想提另一个答案,cmets 提供了我正在寻找的答案:
Why doesn't Java's main use a variable length argument list?
评论 1:有趣。从其他答案/cmets 来看,我猜这个新的主要声明语法是在 Java 1.5 中添加的。所以 Java 运行时会根据你的 main 方法声明来决定是直接将字符串传递给 main 还是先构建一个数组?
评论 2:不,它总是构建一个数组。 String... args == String[] args,就被调用的方法而言。参数无论如何都是一个数组
这就是我的问题。抱歉,如果问得不好。
【问题讨论】:
-
基本上,因为 JLS 是这么说的。见this answer。
-
varargs 在 Java 中是有效的,因为我猜是 1.5。 stackoverflow.com/questions/301563/…的可能重复
-
@Wizard 不是重复的。我不是在问一种语法对另一种语法有什么好处。当您使用任何一种语法时,我正在询问以相同结果运行 Java 代码的底层实现。
-
从现在开始我称他们为“vargars”。听起来很酷。
-
这是一个非常初级的问题。也许我问得不好。如果您投反对票,请告诉我原因或编辑问题。这很有帮助。谢谢。