Kotlin中的静态扩展方法

你如何在Kotlin中定义一个静态的扩展方法? 这甚至有可能吗? 我目前有一个扩展方法如下所示。

public fun Uber.doMagic(context: Context) { // ... } 

上面的扩展可以在一个实例上调用。

 uberInstance.doMagic(context) // Instance method 

但是我如何使它静态方法如下所示。

 Uber.doMagic(context) // Static or class method 

要实现Uber.doMagic(context) ,你可以写一个扩展到Uber的伴侣对象(需要伴随对象声明):

 class Uber { companion object {} } fun Uber.Companion.doMagic(context: Context) { } 

这是官方文件说的:

Kotlin为包级函数生成静态方法。 如果您将这些函数注释为@JvmStatic,Kotlin也可以为命名对象或伴随对象中定义的函数生成静态方法。 例如:

Kotlin静态方法

 class C { companion object { @JvmStatic fun foo() {} fun bar() {} } } 

现在,foo()在Java中是静态的,而bar()不是:

 C.foo(); // works fine C.bar(); // error: not a static method 

您可以使用Companion对象创build一个静态方法,如下所示:

 class Foo { // ... companion object { public fun bar() { // do anything } } } 

然后你可以这样称呼它:

 class Baz { // ... private fun callBar() { Foo.bar() } } 

推荐你看看这个链接。 正如你所看到的那样,你只需要在包(文件)的顶层声明方法:

 package strings public fun joinToString(...): String { ... } 

这相当于

 package strings; public class JoinKt { public static String joinToString(...) { ... } } 

用constans一切都是一样的。 这个声明

 val UNIX_LINE_SEPARATOR = "\n" 

等于

 public static final String UNIX_LINE_SEPARATOR = "\n"; 

我也非常喜欢在Kotlin中添加静态扩展方法的可能性。 作为一个解决方法,现在我将exntension方法添加到多个类中,而不是在所有类中使用一个静态扩展方法。

 class Util fun Util.isDeviceOnline(context: Context): Boolean { val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connMgr.activeNetworkInfo return networkInfo != null && networkInfo.isConnected } fun Activity.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) } fun OkHttpClient.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) }