gpt4 book ai didi

kotlin - () -> Unit 和 (Unit) -> Unit 类型有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 13:33:33 29 4
gpt4 key购买 nike

我有以下功能:

fun <T, U> process(t: T, call: (U) -> Unit, map: (T) -> U) = call(map(t))

fun <T> processEmpty(t: T, call: () -> Unit) = process(t, call, {}) // error

但是 processEmpty 没有编译。错误消息是 Type mismatch: inferred type is () -> kotlin.Unit but (kotlin.Unit) -> kotlin.Unit is expected。但是如果我将此功能更改为

fun <T> processEmpty2(t: T, call: (Unit) -> Unit) = process(t, call, {}) // OK

那么 () -> Unit(Unit) -> Unit 类型有什么区别呢?为什么第一个版本的 processEmpty 没有编译?

最佳答案

Unit实际上是一个type that has exactly one value (值是 Unit 本身;这也是它被命名为 Unit 的原因)。它对应于Java中的void,但并不相同。

Kotlin 编译器将没有声明返回值的函数视为 Unit-returning functions , 和 return Unit 也可以省略。这就是为什么 { } 是一个返回单位的函数。

但这不适用于参数。严格来说,当你声明一个带有 Unit 参数或 (Unit) -> Unit 函数变量的函数时,你必须传递一个 Unit 在调用现场。唯一要传递的值是 Unit

{ doSomething() } 这样没有指定参数的 lambda 既被视为没有参数的函数,也被视为具有单个隐式参数 it 的函数。您可以将 { } 用作 () -> Unit(Unit) -> Unit

至于调用站点,如上所述,必须传递 Unit:

val f: (Unit) -> Unit = { println("Hello") }

f(Unit) // the only valid call

() -> Unit 函数不需要传递参数:

val f: () -> Unit = { println("Hello") }

f() // valid call


在您的示例中,类型推断发生如下:

fun <T, U> process(t: T, call: (U) -> Unit, map: (T) -> U) = call(map(t))

fun <T> processEmpty(t: T, call: () -> Unit) = process(t, call, {}) // error
  1. map: (T) -> U = { },因此 U 的替换是 Unit{ } 返回.
  2. 因此 call 应该是 (Unit) -> Unit
  3. call: () -> Unit(Unit) -> Unit 不同,如上所述。错误。

关于kotlin - () -> Unit 和 (Unit) -> Unit 类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35360630/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com