Som*_*NEW 4 compiler-construction jvm kotlin
最近开始学习Kotlin。在 Kotlin 中声明 main 函数时,我注意到一个有趣的行为。即使在对象类中,它也使用 @JvmStatic 注释。我环顾四周,没有找到相关的帖子。
object Main {
@JvmStatic
fun main(args: Array<String>) {
println("Hello World")
}
}
Run Code Online (Sandbox Code Playgroud)
为什么 Kotlin 中的 main 函数需要 @JvmStatic 注解?
来自 Java 和 Scala 的背景,这似乎是多余和不必要的,所以我很好奇是什么背景和决策使得 Kotlin 采用了这个约定。
@JvmStatic如果您声明为顶级函数,则不需要。main也就是说,如果您的整个 Kotlin 源文件是:
fun main(args: Array<String>) {
println("Hello World")
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下你不需要@JvmStatic- 所有顶级函数都被转换为 Java 中的静态方法,在XXXKt默认调用的类中,其中XXX是你的 Kotlin 文件名。
请注意,对于 Kotlin 中的无参数顶级main,编译器实际上会生成一个正确的 Java main,它接受String[] args, 并委托给您的 Kotlin 函数。
// the Kotlin main gets converted to something like this...
public static void main$1() {
// your kotlin code here...
}
// A proper Java main generated by Kotlin
public static void main(String[] args) {
main$1();
}
Run Code Online (Sandbox Code Playgroud)
当您将方法放入 an 中时,您确实需要这样做,因为s 在 Java 中被转换为单例类。默认情况下, 中的所有成员都是非静态的。@JvmStaticmainobjectobjectobject
object MyObject {
fun main(args: Array<String>) {
}
}
Run Code Online (Sandbox Code Playgroud)
被翻译成这样:
public final class MyObject {
private MyObject() {}
public static final MyObject INSTANCE = new MyObject();
public void main(String[] args) { }
}
Run Code Online (Sandbox Code Playgroud)
当你MyObject.main(...)用 Kotlin 做事时,实际上是MyObject.INSTANCE.main(...)用 Java 做事。显然,这样的main方法不能用作Java程序的入口点,因为它不是静态的。