Kotlin静态function:伴随对象,@JvmStatic @JvmField
我刚刚开始使用Kotlin Programming Language
,它比Java更酷。 我对静态方法和领域有一些疑问,
Q1:官方文件说
如果您将这些函数注释为@JvmStatic,Kotlin也可以为命名对象或伴随对象中定义的函数生成静态方法。
但是,如果你看到下面我可以访问bar()
方法作为静态方法,它不使用@JvmStatic
注释工作。 但官方文档抛出错误 – > Kotlin静态方法 。
Class C{ companion object{ @JvmStatic fun foo() { } fun bar(); } } fun main(args: Array) { C.foo(); C.bar(); //this line works fine }
Q2:我真的需要@JvmStatic
和@JvmField
来使事情变得静态吗? :正如你可以看到的companion
对象,事情按预期工作。
happyCoding
您可以在Kotlin中以C.bar()
方式访问companion object
成员,但不能以Java方式访问。 如果没有@JvmStatic
,则需要在Java中使用C.Companion.bar()
,就像在文档中所说的那样。
请注意,如果没有@JvmStatic
,该函数将被编译为一个在Java中的C.Companion
上调用的实例(非静态)方法(而Kotlin只是将它缩短为C
上的一个调用,但在引擎盖下是一样的)所以是的,你需要@JvmStatic
和@JvmField
在伴侣对象中进行声明编译为静态成员。
基本上, @JvmStatic
和@JvmField
是用于Java互操作的工具,可以帮助创建对Java友好的API,如果不需要从Java调用Kotlin成员(例如,它们是Kotlin项目的内部组件,或者您正在开发库,不太可能与Java一起使用),你可以保持原样。
是的,你需要@JvmStatic
。 在Java代码中,在文档代码中用Kotlin调用代码的问题。
更确切地说,这段代码不会被编译:
public void main(String[] args) { C.foo(); // Ok C.bar(); // Not ok }
Kotlin知道companion object
函数,所以你可以直接在类上调用它,而Java对它没有任何了解。 所以你用@JvmStatic
注释了任何函数,并且它从Java代码中变成了可见的静态方法。
而对于clarfiy来说, @JvmStatic
JvmStatic的目的是与Java代码进行互操作。 如果你在Kotlin中编写你的应用程序,则根本不需要@JvmStatic
。
文档(“第2页”)是指从Java调用函数而不是Kotlin的情况。
当你只使用Kotlin时,不需要注解。 而是使用你声明你的bar()方法的方式。 所以你可以调用C.bar()