- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚开始使用 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/
目前我有一个 abstract class : abstract class Vec2t { abstract var x: T abstract var y: T
LinkedIn 问题 const val 可以做什么 @JvmField val 不能做什么? 关于 Val 和 const 之间的区别,有多种答案。canst Val 和 @JvmField Va
我正在测试一个新的 kotlin-allopen和 kotlin-spring Kotlin 下的插件 1.0.6 . 在我的其中之一 @Transactional -带注释的类我有一个字段: @Jv
我刚刚开始使用 Kotlin 编程语言,它比 Java 要酷得多。我对静态方法和字段有一些疑问: Q1:官方文档说 Kotlin can also generate static methods fo
我想知道这是否可以使用编译器参数或插件来完成。我有现有的 java 模块,已转换为 kotlin,但它有一堆静态方法/字段。在某些时候,我想重构它,但现在这个库的(java)使用者无法工作,除非我手动
我是一名优秀的程序员,十分优秀!