为啥 Kotlin 允许编写不带参数的 main 函数?

Posted

技术标签:

【中文标题】为啥 Kotlin 允许编写不带参数的 main 函数?【英文标题】:Why Kotlin allow write main function with no arguments?为什么 Kotlin 允许编写不带参数的 main 函数? 【发布时间】:2019-09-11 14:26:48 【问题描述】:

最近开始学习Kotlin,发现main()函数可以不带参数写成这样:

fun main() 
    dayOfWeek()

这怎么可能?Kotlin 在幕后做了什么? Java 不允许我们这样做。

【问题讨论】:

感谢您花时间学习新事物,而不是使用 *** 来修复错误:D. 【参考方案1】:

main 的签名基于 Java 虚拟机的期望:

Java 虚拟机通过调用 main 方法开始执行 一些指定的类,传递给它一个参数,这是一个 字符串数组。

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

public static void main(String[] args) public static void 主要(字符串...参数)

Ref1, Ref2

所以是的,我们应该在main 方法中定义一个数组字符串参数。但是,正如你所问,

这怎么可能?Kotlin 在后台做了什么?

让我们看看,

Kotlin 代码

// fileName : Main.kt
fun main() 
    println("Hello World!")

编译的 Java 代码

public final class MainKt 
   public static final void main() 
      String var0 = "Hello World!";
      System.out.println(var0);
   

   // $FF: synthetic method
   public static void main(String[] var0) 
      main();
   

如您所见,在编译后的 Java 代码中,Kotlin 使用方法重载来调用带有 String[] 参数的 main 方法。由此我们可以理解,Koltin 只是帮助我们节省了时间,让语法更具可读性。

在内部,Kotlin 使用 String[] 参数调用 main 方法。

提示

如果您使用的是 IntelliJ IDEA,则可以使用内置的 Kotlin 工具查看编译后的 Java 版本的 Kotlin 代码。

    Menu > Tools > Kotlin > Show Kotlin Bytecode 点击Decompile按钮

您可以从here找到带有屏幕截图的简单指南

【讨论】:

您使用哪个 IDE 进行 Kotlin 开发? IntelliJ IDEA ? 小毛病:它是调用main(String[])的JVM启动器,当然它对Kotlin一无所知。【参考方案2】:

其他语言(如 C/C++)允许使用空参数列表的 main 函数。在幕后,它们只是通常的main 方法,参数被忽略。此功能纯粹是为了简化短程序和演示软件的语法

【讨论】:

以上是关于为啥 Kotlin 允许编写不带参数的 main 函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥AngularJS货币过滤器格式负数用括号

Kotlin 函数定义

Kotlin函数 ④ ( 匿名函数参数 | 匿名函数 it 关键字 )

为啥 Kotlin 不能推断以下 lambda 参数(在 Java -> Kotlin 转换之后)?

为啥@JacksonXmlProperty 使用 Kotlin 忽略 Spring Boot 中的参数?

涉及变量引用和子表达式的参数模式中不带引号的标记:为啥它们有时会分成多个参数?