如果将main
声明为顶级函数,则@JvmStatic
是必需的102.也就是说,如果您的整个Kotlin源文件是:
fun main(args: Array<String>) {
println("Hello World")
}
在这种情况下,您不需要@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();
}
当您将main
方法放入object
中时,do需要@JvmStatic
,因为object
在Java中被转换为单例类.object
中的所有成员默认情况下都是非静态的.
object MyObject {
fun main(args: Array<String>) {
}
}
翻译成如下所示:
public final class MyObject {
private MyObject() {}
public static final MyObject INSTANCE = new MyObject();
public void main(String[] args) { }
}
当你在Kotlin中做MyObject.main(...)
,在Java中实际上是MyObject.INSTANCE.main(...)
.显然,这样的main
方法不能用作Java程序的入口点,因为它不是静态的.