android - Kotlin 静态函数 : companion object, @JvmStatic @JvmField

标签 android static kotlin

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

Q1:官方文档说

Kotlin can also generate static methods for functions defined in named objects or companion objects if you annotate those functions as @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 对象中看到的那样,一切都按预期进行。

最佳答案

您可以在 C.bar() 在 Kotlin 中访问 companion object 的成员,但在 Java 中则不行。如果没有 @JvmStatic,您将需要使用 C.Companion.bar() in Java,正如文档中所述。

请注意,如果没有 @JvmStatic,该函数将编译为在 Java 中的 C.Companion 上调用的实例(非静态)方法(以及 Kotlin将其缩短为对 C 的调用,但在底层是相同的),所以是的,您需要 @JvmStatic@JvmField 来将伴随对象中的声明编译为静态成员。

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

关于android - Kotlin 静态函数 : companion object, @JvmStatic @JvmField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225293/

相关文章:

android - 如何将参数从 Activity 传递给服务?

android - RecyclerView 中 registerDataSetObserver() 的替代方案

c++ - 在静态变量的构造函数中检索静态常量变量的值

java - 一个只有 "private final static"变量的 java 类。这是个好主意吗?

eclipse - 在Eclipse中调试时修改静态变量

接口(interface)错误中的 Kotlin 默认参数?

android - window.reload 在 Webview 中

android - 没有名称引用的 koin 默认实现

kotlin - 使用方法notify()实例化Kotlin类的LinkageError

android - 小米/华为/Lava 上 RAM 已满后粘性服务无法重新启动