如何在 Kotlin 中将通用范围的挂起 lambda 传递给类方法?



想要在一个开放类中有一个函数,它可以接受挂起的lambda并运行它。

我知道当您显式指定类型时这有效,但如果可能的话,需要它来接受通用范围的 lambda。

class ChildClass : SuperClass() {
// does work :)
fun launch(block: suspend ChildClass.() -> Unit) =
coroutineThing { this.block() }
}
open class SuperClass {
// doesn't work :(
fun <T : SuperClass> launch(block: suspend T.() -> Unit) = 
coroutineThing { this.block() }
}

我得到的错误是Expression 'block' of type 'suspend T.() -> Unit' cannot be invoked as a function. The function 'invoke()' is not found.

编辑:

希望最终从 ChildClass 的实例中调用此方法,如下所示:ChildClass().launch { doStuff() }

你可以这样写,但我不知道它是如何工作的:)对我来说,这看起来像是 Kotlin 问题。

open class SuperClass {
fun <T : SuperClass> launch(block: suspend T.() -> Unit) =
coroutineThing { block.invoke(this as T) }
}

但在这种情况下,您必须像这样调用它:

ChildClass().launch<ChildClass> { println("test") }

但是您可以稍微更改一下以根据需要调用它:

open class SuperClass<T : SuperClass<T>> {
fun launch(block: suspend T.() -> Unit) =
coroutineThing { block.invoke(this as T) }
}
class ChildClass : SuperClass<ChildClass>()
//invokation
ChildClass().launch { println("test") }

这个怎么样?

open class SuperClass {

fun<T: SuperClass> launch(superClass: T, block: suspend T.() -> Unit) {
GlobalScope.launch {
superClass.block()
}
}
}

open class ChildClass: SuperClass() {
suspend fun print() {
}
}

fun test () {
val a = ChildClass()
a.apply {
launch(this) {
print()
}
}
}

最新更新