关于Kotlin MutableSharedFlow接收带参数Lambda的疑问
你定义了如下类型的MutableSharedFlow:
var flow: MutableSharedFlow<() -> Unit>
它接收的元素是无参且返回值为Unit的Lambda。同时你还定义了两个函数:
fun foo() fun foo2(arg: SomeClass)
你能理解flow.tryEmit { foo() }可以正常运行,因为这个Lambda符合() -> Unit的类型要求,但对flow.tryEmit { foo2(arg) }也能正常运行感到困惑——毕竟foo2是带参数的函数。
核心原因解释
这里的关键是:你传递的{ foo2(arg) }本身仍然是无参Lambda,它完全符合() -> Unit的类型要求:
- 这个Lambda不需要接收任何外部传入的参数,
arg是当前作用域中已经存在的变量(比如局部变量、类成员变量等),Lambda只是捕获了这个变量,在自身执行时用它去调用foo2。 - 如果你尝试直接传递
foo2的函数引用::foo2,代码才会报错,因为::foo2的类型是(SomeClass) -> Unit,和流要求的() -> Unit类型不匹配。
简单总结:流要求的是“不需要输入参数、执行后返回Unit的代码块”,而{ foo2(arg) }完全满足:它不需要外部传参,执行时用捕获到的arg调用foo2,最终返回Unit(foo2的返回值就是Unit)。
内容的提问来源于stack exchange,提问作者Lavan
相关产品推荐
相关产品推荐

