【问题标题】:Why is Array<String> the chosen parameter type for the main function in kotlin?为什么 Array<String> 是 kotlin 中主函数的选择参数类型?
【发布时间】:2019-01-23 10:35:51
【问题描述】:

kotlin中的main函数:

fun main(args : Array<String>) { 
  println("Hello, world!") 
}

为什么传入一个Array?

【问题讨论】:

  • 为什么要显式使用数组或参数为什么存在?

标签: java kotlin jvm


【解决方案1】:

main的签名是基于Java虚拟机expects

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

public static void main(String[] args)
public static void main(String... args)

这是 Kotlin 编译器将您的 main 函数编译成的内容。从 Kotlin 1.3 开始,可以省略显式 Array&lt;String&gt;,但仍可在字节码中使用。

【讨论】:

  • 谢谢。但是他们选择String[]作为传递的类型有什么原因吗?
  • 你通常会像这样启动一个 jvm 程序:java [...] ClassX arg1 arg2 arg3 这将使 args 在 ClassX 的 main 的 String [] 中可用
  • 你会使用什么其他类型来传递命令行参数?
  • 其他语言如C:cprogramming.com/tutorial/c/lesson14.html也是如此
【解决方案2】:

Collections 在 JAVA 1 中不存在。因此,Array 是默认选择。命令行提供的参数也是字符串格式,因此我们使用Array&lt;String&gt;。为了保持与 JAVA 的互操作性,Kotlin 遵循了相同的约定。但是,随着 Kotlin 1.3 的更新,这也被省略了。现在您可以使用main() 函数而无需传递args:Array&lt;String&gt;

【讨论】:

    【解决方案3】:

    数组包含传递给程序的命令行参数。

    你也可以省略它,如果你不想使用它们,你也可以直接写:

    fun main() {
      println("Hello, world!")
    }
    

    我已经来不及在这里链接到JLS for Test.mains1m0nw1 already did;我刚准备好就走了;-))

    但是我想补充一点关于String 的选择(即我认为为什么选择String):它可能是所有可能的命令行参数的最常见的分母。 Any/Object 太宽泛了;您只能将命令行中的数字或字符串传递给程序(管道的处理方式不同)。但是数字类型太窄了,所以剩下的唯一可接受的类型是String,它可以代表两者。如果你想使用它们,你仍然需要解析数字,但这比从数字中解释一个字符串更好;-)

    【讨论】:

    • 如果主函数没有做任何事情,那么为什么需要它?我假设 main 函数执行了其他函数。
    • 不用等待...main-function 实际上是您的应用程序的入口点...或者换句话说:没有main-function,您的程序将无法运行...例如,您可以使用它调用:java TestKt,然后它将运行您的程序(如果将main 放在名为Test.kt 的文件中并编译为class-file 等pp)跨度>
    • 例如:如果你使用你的IDE“运行”你的文件,没有main-function,它根本不会运行(存在例外,例如你也可以运行测试和其他东西...)
    【解决方案4】:

    您正在定义应用程序的入口点。在这种情况下,应用程序将从主函数开始运行。传递字符串类型的参数数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-07-13
      • 2018-09-19
      • 2012-12-16
      • 2021-10-16
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多