【发布时间】:2019-01-23 10:35:51
【问题描述】:
kotlin中的main函数:
fun main(args : Array<String>) {
println("Hello, world!")
}
为什么传入一个Array?
【问题讨论】:
-
为什么要显式使用数组或参数为什么存在?
kotlin中的main函数:
fun main(args : Array<String>) {
println("Hello, world!")
}
为什么传入一个Array?
【问题讨论】:
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<String>,但仍可在字节码中使用。
【讨论】:
String[]作为传递的类型有什么原因吗?
java [...] ClassX arg1 arg2 arg3 这将使 args 在 ClassX 的 main 的 String [] 中可用
Collections 在 JAVA 1 中不存在。因此,Array 是默认选择。命令行提供的参数也是字符串格式,因此我们使用Array<String>。为了保持与 JAVA 的互操作性,Kotlin 遵循了相同的约定。但是,随着 Kotlin 1.3 的更新,这也被省略了。现在您可以使用main() 函数而无需传递args:Array<String>。
【讨论】:
数组包含传递给程序的命令行参数。
你也可以省略它,如果你不想使用它们,你也可以直接写:
fun main() {
println("Hello, world!")
}
我已经来不及在这里链接到JLS for Test.main(s1m0nw1 already did;我刚准备好就走了;-))
但是我想补充一点关于String 的选择(即我认为为什么选择String):它可能是所有可能的命令行参数的最常见的分母。 Any/Object 太宽泛了;您只能将命令行中的数字或字符串传递给程序(管道的处理方式不同)。但是数字类型太窄了,所以剩下的唯一可接受的类型是String,它可以代表两者。如果你想使用它们,你仍然需要解析数字,但这比从数字中解释一个字符串更好;-)
【讨论】:
main-function 实际上是您的应用程序的入口点...或者换句话说:没有main-function,您的程序将无法运行...例如,您可以使用它调用:java TestKt,然后它将运行您的程序(如果将main 放在名为Test.kt 的文件中并编译为class-file 等pp)跨度>
main-function,它根本不会运行(存在例外,例如你也可以运行测试和其他东西...)
您正在定义应用程序的入口点。在这种情况下,应用程序将从主函数开始运行。传递字符串类型的参数数组。
【讨论】: