Kotlin 中的 Java 静态方法等价物是什么?

新手上路,请多包涵

Kotlin 中没有 static 关键字。

在 Kotlin 中表示 static Java 方法的最佳方式是什么?

原文由 pdeva 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 458
2 个回答

您将函数放在“伴侣对象”中。

所以java代码是这样的:

 class Foo {
  public static int a() { return 1; }
}

会变成

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

然后,您可以在 Kotlin 代码中将其用作

Foo.a();

但是在 Java 代码中,您需要将其称为

Foo.Companion.a();

(这也适用于 Kotlin。)

如果您不喜欢指定 Companion 位,您可以添加 @JvmStatic 注释或命名您的同伴类。

文档

伴随对象

类中的对象声明可以用 companion 关键字标记:

>  class MyClass {
>    companion object Factory {
>        fun create(): MyClass = MyClass()
>    }
> }
>
> ```
>
> 可以通过简单地使用类名作为限定符来调用伴生对象的成员:
>
> ```
>  val instance = MyClass.create()
>
> ```
>
> ...
>
> 但是,在 JVM 上,如果您使用 `@JvmStatic` 注释,您可以将伴随对象的成员生成为真正的静态方法和字段。有关更多详细信息,请参阅 [Java 互操作性](https://kotlinlang.org/docs/java-to-kotlin-interop.html#static-fields) 部分。

添加 `@JvmStatic` 注释看起来像这样

class Foo { companion object { @JvmStatic fun a() : Int = 1; } }


然后它将作为一个真正的 Java 静态函数存在,可以从 Java 和 Kotlin 访问为 `Foo.a()` 。

如果只是不喜欢 `Companion` 名称,那么您还可以为伴随对象提供显式名称,如下所示:

class Foo { companion object Blah { fun a() : Int = 1; } }

”`

这将让您以相同的方式从 Kotlin 调用它,但可以从 java 中调用它,例如 Foo.Blah.a() (在 Kotlin 中也可以使用)。

原文由 Michael Anderson 发布,翻译遵循 CC BY-SA 4.0 许可协议

文档 建议用 包级函数 解决大部分静态函数的需求。它们只是在源代码文件的类之外声明。文件的包可以在文件的开头用 package 关键字指定。

宣言

package foo

fun bar() = {}

用法

import foo.bar

或者

import foo.*

您现在可以调用该函数:

 bar()

或者如果您不使用 import 关键字:

 foo.bar()

如果您不指定包,则可以从根目录访问该函数。

如果您只有 java 经验,这可能看起来有点奇怪。原因是 kotlin 不是严格面向对象的语言。你可以说它支持类外的方法。

编辑:他们已经编辑了文档,不再包含关于推荐包级功能的句子。 是上面提到的原件。

原文由 Henrik F. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题