什么是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注释或命名伴随类。

从文档 :

伴侣对象

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

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

同伴对象的成员可以简单地使用类名作为限定符来调用:

 val instance = MyClass.create() 

但是,如果使用@JvmStatic注释,那么在JVM上可以将伴随对象的成员生成为真正的静态方法和字段。 有关更多详细信息,请参阅Java互操作性部分。

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

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

然后a将作为一个真正的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不是严格的面向对象的语言。 你可以说它支持类之外的方法。

1.定义

任何 method/ val/ var内部的object (关键字为Singleton )将在java中像静态一样。

如果您想简单地使用包含对象的类来调用方法,请使用companion object对象。

 object Foo{ fun sayFoo() = println("Foo") val bar ="bar" } 

2.用法:

 Foo.sayFoo() println(Foo.bar) 

3.输出:

 Foo bar 

直接写入文件。

在Java(丑陋):

 package xxx; class XxxUtils { public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); } } 

在Kotlin:

 @file:JvmName("XxxUtils") package xxx fun xxx(xxx: Xxx): Yyy = xxx.xxx() 

这两段代码在编译之后是相等的(即使是编译的文件名, file:JvmName也是用来控制编译的文件名的,这个文件名应该放在包名声明的前面)。

因为kotlin没有static关键字,所以你需要传递伴侣对象作为静态方法 – 可以简单地使用类名作为限定符来调用伴随对象的成员:

 package xxx class ClassName { companion object { fun helloWord(str: String): String { return stringValue } } }