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

时间:2018-01-12 11:24:13

标签: android static kotlin

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

Q1:官方文件说

  

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

但如果您在下面看到我可以访问bar()方法作为静态方法,它可以在不使用@JvmStatic注释的情况下工作。但在官方文件中它的投掷错误 - > Kotlin static method

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

Q2:我真的需要@JvmStatic@JvmField让事情变得不稳定吗? 正如您在companion对象中看到的那样,事情正在按预期工作。

3 个答案:

答案 0 :(得分:8)

您可以在Kotlin 中访问companion object的{​​{1}} 成员,但不能使用Java。如果没有C.bar(),则需要在Java中使用@JvmStatic ,就像在文档中所述。

请注意,如果没有C.Companion.bar(),该函数将被编译为在Java中@JvmStatic上调用的实例(非静态)方法(而Kotlin只是简化为{{1}上的调用但是,它是相同的,所以是的,您需要C.CompanionC在伴侣对象中进行声明编译成静态成员。

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

答案 1 :(得分:2)

是的,你确实需要include。您在文档代码中将其称为在Kotlin 中的代码问题在Java 中称为

更准确地说,这段代码不会编译:

snippets/fastcgi-php.conf

Kotlin知道include fastcgi_params;中的函数,所以你可以直接在类上调用它,而Java对它一无所知。因此,您使用@JvmStatic注释任何函数,并且它从Java代码中变为可见的静态方法。

只是为了澄清 - public void main(String[] args) { C.foo(); // Ok C.bar(); // Not ok } 的目的是与Java代码互操作。如果您在Kotlin中编写应用程序,则根本不需要companion object

答案 2 :(得分:0)

文档(&#34;第2页和第34页;)是指从Java调用函数的情况,而不是Kotlin。

当您只使用Kotlin时,不需要注释。而是使用您声明bar()方法的方式。所以你可以致电C.bar()