如何在Kotlin中定义静态扩展方法?这有可能吗?我目前有一个扩展方法,如下所示。
public fun Uber.doMagic(context: Context) {
// ...
}
可以在实例上调用以上扩展。
uberInstance.doMagic(context) // Instance method
但是我如何使其变为静态方法,如下所示。
Uber.doMagic(context) // Static or class method
如何在Kotlin中定义静态扩展方法?这有可能吗?我目前有一个扩展方法,如下所示。
public fun Uber.doMagic(context: Context) {
// ...
}
可以在实例上调用以上扩展。
uberInstance.doMagic(context) // Instance method
但是我如何使其变为静态方法,如下所示。
Uber.doMagic(context) // Static or class method
Answers:
要实现Uber.doMagic(context)
,你可以写一个扩展的同伴对象的Uber
(需要同伴对象的声明):
class Uber {
companion object {}
}
fun Uber.Companion.doMagic(context: Context) { }
官方文件是这样说的:
Kotlin为程序包级功能生成静态方法。如果您将这些功能注释为@JvmStatic,则Kotlin还可以为在命名对象或伴随对象中定义的功能生成静态方法。例如:
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
现在,foo()在Java中是静态的,而bar()不是:
C.foo(); // works fine
C.bar(); // error: not a static method
我实际上是在30分钟前遇到了这个确切的问题,所以我开始四处搜寻,但找不到任何解决方案或解决方法,但是在搜索时,我在Kotlinglang网站上发现了此部分,其中指出:
请注意,可以使用可为空的接收器类型定义扩展。即使对象变量的值为null,也可以对其进行扩展。
因此,我有史以来最疯狂的想法,为什么不使用可为空的接收器(而不实际使用该接收器)定义扩展函数,然后在空对象上调用它呢!所以我尝试了一下,效果很好,但是看起来很丑。就像这样:
(null as Type?).staticFunction(param1, param2)
因此,我在接收器类型的扩展文件中创建一个值为NULL的val,然后在其他类中使用它来解决此问题。因此,作为示例,这是我如何为Navigation
Android中的类实现“静态”扩展功能:在我的NavigationExtensions.kt文件中:
val SNavigation: Navigation? = null
fun Navigation?.createNavigateOnClickListener(@IdRes resId: Int, args: Bundle? = null, navOptions: NavOptions? = null,
navigationExtras: Navigator.Extras? = null) : (View) -> Unit {
//This is just implementation details, don't worry too much about them, just focus on the Navigation? part in the method declaration
return { view: View -> view.navigate(resId, args, navOptions, navigationExtras) }
}
在使用它的代码中:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
显然,这不是一个类名,它只是具有空值的类类型的变量。在扩展制造商方面(因为他们必须创建变量)和开发人员方面(因为他们必须使用SType
格式而不是实际的类名),这显然很丑陋,但这是目前可以实现的最接近的方法与实际的静态功能相比。希望Kotlin语言制作者将对所创建的问题做出回应,并将其添加到语言中。
您可以使用Companion对象创建静态方法,例如:
class Foo {
// ...
companion object {
public fun bar() {
// do anything
}
}
}
然后您可以这样称呼它:
class Baz {
// ...
private fun callBar() {
Foo.bar()
}
}
platformStatic
注释。
platformStatic
JvmStatic
在当前的Kotlin中被重命名。
建议您查看此链接。如您所见,您只需要在包(文件)的顶层声明方法:
package strings
public fun joinToString(...): String { ... }
这等于
package strings;
public class JoinKt {
public static String joinToString(...) { ... }
}
对于constan,一切都是相同的。这个宣言
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) }
Activity.isDeviceOnline(...)
没有实例的情况下直接进行调用Activity
。
要在kotlin中创建扩展方法,您必须创建一个kotlin文件(不是类),然后在文件Eg中声明您的方法:
public fun String.toLowercase(){
// **this** is the string object
}
将函数导入正在使用的类或文件中,然后使用它。