协慌网

登录 贡献 社区

Kotlin 中的 Java 静态方法等效于什么?

Kotlin 中没有static

用 Kotlin static Java 方法的最佳方法是什么?

答案

您将功能放置在 “伴侣对象” 中。

所以像这样的 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批注或命名您的伴侣类。

文档

伴侣对象

类内的对象声明可以用伴随关键字标记:

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

可以通过仅使用类名作为限定符来调用伴随对象的成员:

val instance = MyClass.create()

...

@JvmStatic批注,则可以将伴随对象的成员生成为实际的静态方法和字段。有关更多详细信息,请参见 Java 互操作性部分。

添加@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 调用它,但可以从Foo.Blah.a()类的 Java 中调用它(在 Kotlin 中也可以使用)。

Docs建议使用包级功能解决静态功能的大多数需求。它们只是在源代码文件中的类外部声明。可以使用 package 关键字在文件的开头指定文件的软件包。

宣言

package foo

fun bar() = {}

用法

import foo.bar

或者

import foo.*

现在,您可以使用以下命令调用该函数:

bar()

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

foo.bar()

如果不指定软件包,则可以从根目录访问该功能。

如果您只有 Java 经验,这似乎有些奇怪。原因是 kotlin 不是严格的面向对象语言。您可以说它支持类之外的方法。

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

A. 旧的 Java 方式:

  1. 声明一个companion object以包含一个静态方法 / 变量

    class Foo{
    companion object {
        fun foo() = println("Foo")
        val bar ="bar"  
        }
    }
  2. 用 :

    Foo.foo()        // Outputs Foo    
    println(Foo.bar) // Outputs bar


B. 新科特林方式

  1. 直接声明文件,而不.kt文件的类。

    fun foo() = println("Foo")
    val bar ="bar"
  2. methods/variables与它们的名称一起使用。 (导入后

    用 :

    foo()        // Outputs Foo          
    println(bar) // Outputs bar