kotlin - 如何将通用范围的暂停 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() }
解决方案
你可以这样写,但我不知道它是如何工作的 :) 对我来说,它看起来像 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") }
推荐阅读
- python - 使用python在弹性搜索中自动完成
- apache-spark - Spark结构化流式实时聚合
- python - 有没有办法动态更改子模块名称
- firebase - Flutter Firebase 上传多张图片
- python-3.x - 拆分功能不适用于字符串和列表
- c++ - 'std::string*& {aka std::basic_string 类型的非常量引用的初始化无效
*&}' 来自 'std::string* {aka - database - 我想听听关于在这个项目中使用时间序列数据库的想法:
- javascript - 配置 webpack 以将 _ 解析为 lodash 索引
- ruby-on-rails - 如何将两个不同模型的 ID 传递给一个新模型?
- python - 引用满足特定条件的 np.array 元素的最快方法