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()