Rag*_*har 125 static-methods kotlin
如何在Kotlin中定义静态扩展方法?这甚至可能吗?我目前有一个扩展方法,如下所示.
public fun Uber.doMagic(context: Context) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
可以在实例上调用上述扩展名.
uberInstance.doMagic(context) // Instance method
Run Code Online (Sandbox Code Playgroud)
但是如何使它成为静态方法,如下所示.
Uber.doMagic(context) // Static or class method
Run Code Online (Sandbox Code Playgroud)
And*_*lav 116
要实现Uber.doMagic(context),你可以写一个扩展的同伴对象的Uber(需要同伴对象的声明):
class Uber {
companion object {}
}
fun Uber.Companion.doMagic(context: Context) { }
Run Code Online (Sandbox Code Playgroud)
Jus*_*tin 20
由于我在搜索时不断遇到这种情况,因此这里有一种不同的方法,我没有看到任何人提到它以静态方式工作,并且它与泛型一起工作!
技巧是将扩展函数附加到KClass类型的 ,因为它可以静态引用。
正如 @Zaffy 在评论中提到的,扩展特定类型:
fun KClass<MyType>.doSomething() = /* do something */
Run Code Online (Sandbox Code Playgroud)
通用类型扩展:
// Extension function
fun <T> KClass<T>.doSomething() = /* do something */
// Extension Property
val <T> KClass<T>.someVal get() = /* something */
Run Code Online (Sandbox Code Playgroud)
用法:
MyType::class.doSomething()
MyType::class.someVal
Run Code Online (Sandbox Code Playgroud)
luc*_*iel 12
这是官方文件说的:
Kotlin为包级函数生成静态方法.如果您将这些函数注释为@JvmStatic,Kotlin还可以为命名对象或伴随对象中定义的函数生成静态方法.例如:
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,foo()在Java中是静态的,而bar()不是:
C.foo(); // works fine
C.bar(); // error: not a static method
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用Companion对象创建静态方法,如:
class Foo {
// ...
companion object {
public fun bar() {
// do anything
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样称呼它:
class Baz {
// ...
private fun callBar() {
Foo.bar()
}
}
Run Code Online (Sandbox Code Playgroud)
我实际上是在30分钟前遇到了这个确切的问题,所以我开始四处搜寻,但找不到任何解决方案或解决方法,但是在搜索时,我在Kotlinglang网站上发现了此部分,其中指出:
请注意,可以使用可为空的接收器类型定义扩展。即使对象变量的值为null,也可以对其进行扩展。
因此,我有一个最疯狂的想法,为什么不使用可为空的接收器(而不实际使用该接收器)定义扩展函数,然后在空对象上调用它呢!所以我尝试了一下,效果很好,但是看起来很丑。就像这样:
(null as Type?).staticFunction(param1, param2)
Run Code Online (Sandbox Code Playgroud)
因此,我在接收器类型的扩展文件中创建一个值为NULL的val,然后在其他类中使用它来解决此问题。因此,作为示例,这是我如何为NavigationAndroid中的类实现“静态”扩展功能:在我的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) }
}
Run Code Online (Sandbox Code Playgroud)
在使用它的代码中:
SNavigation.createNavigateOnClickListener(R.id.action_gameWonFragment_to_gameFragment)
Run Code Online (Sandbox Code Playgroud)
显然,这不是一个类名,它只是具有空值的类类型的变量。在扩展制造商方面(因为他们必须创建变量)和开发人员方面(因为他们必须使用SType格式而不是实际的类名),这显然很丑陋,但这是目前可以实现的最接近的方法与实际的静态功能相比。希望Kotlin语言制作者将对所创建的问题做出回应,并在该语言中添加该功能。
| 归档时间: |
|
| 查看次数: |
31943 次 |
| 最近记录: |