想要在一个开放类中有一个函数,它可以接受挂起的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()
}
}
}