Kotlin静态函数:伴侣对象,@ JmmStatic @JvmField

Bha*_*esh 8 static android kotlin

我刚刚开始使用Kotlin编程语言,它比Java更酷.我对静态方法和字段有一些疑问:

Q1:官方文件说

如果您将这些函数注释为@JvmStatic,Kotlin还可以为命名对象或伴随对象中定义的函数生成静态方法.

但是如果你看到下面我可以访问bar()方法作为静态方法,它可以在不使用@JvmStatic注释的情况下工作.但在官方文档上它的抛出错误 - > Kotlin静态方法.

Class C{
    companion object{
        @JvmStatic
        fun foo() { }
        fun bar();
    }
}
fun main(args: Array<String>) {
    C.foo();
    C.bar(); //this line works fine
}
Run Code Online (Sandbox Code Playgroud)

Q2:我真的需要@JvmStatic并且@JvmField让事情变得静止吗? 正如您在companion对象中看到的那样,事情正在按预期工作.

hot*_*key 12

您可以访问的成员companion objectC.bar() 在科特林,但不是在Java中.没有@JvmStatic,你需要C.Companion.bar() 在Java中使用,就像在文档中所说的那样.

请注意,没有@JvmStatic,函数被编译为C.Companion在Java中调用的实例(非静态)方法(而Kotlin只是将其缩短为调用C,但它在引擎盖下是相同的),所以是的,你需要@JvmStatic@JvmField在伴随对象中声明编译成静态成员.

基本上,@JvmStatic并且 @JvmField是Java互操作的工具,有助于创建Java友好的API,如果您不需要从Java调用Kotlin成员(例如,它们是您的Kotlin项目的内部,或者您正在开发一个不太可能的库要与Java一起使用),你可以保留原样.