【问题标题】:Java 8 varargs on main function signature [duplicate]主函数签名上的 Java 8 varargs [重复]
【发布时间】: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... argsString[] 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”。听起来很酷。
  • 这是一个非常初级的问题。也许我问得不好。如果您投反对票,请告诉我原因或编辑问题。这很有帮助。谢谢。

标签: java variadic-functions


【解决方案1】:

我相信,自从 varargs 被添加到语言中以来,它是合法的。当然,显式调用它们的语法不同,但命令行参数不是由其他 Java 代码传递,而是“神奇地”传递。

JLS 12.1.4 指定:

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

public static void main(String[] args)

public static void main(String... args)

【讨论】:

  • 我的印象是javaCode arg1 arg2 会将参数转换为一个数组。因此,我认为定义 main 的另一种方法是使用参数String[]... args,因此它可以采用任意数量的String[]。但我开始了解运行 Java 代码(编译后)和调用 Java 代码(从其他代码)之间的基本区别。
  • 你认为第二维度会从何而来? String[]...String[][] 具有相同的类型。
  • 这就是我的想法。您的回答为我提供了足够的信息来识别我的思维缺陷。现在说得通了。
【解决方案2】:

正如您已经说过的,在编译时,所有 varargs... 都被替换为 arrays[]

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2016-12-04
    • 1970-01-01
    • 2016-06-18
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多