首页 > 解决方案 > 如何将通用范围的暂停 lambda 传递给 Kotlin 中的类方法?

问题描述

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

标签: kotlinkotlin-coroutines

解决方案


你可以这样写,但我不知道它是如何工作的 :) 对我来说,它看起来像 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") }

推荐阅读