为什么Kotlin中Result.map对Unit类型的表现与其他类型不同?
编译差异原因解释
涉及代码片段
可编译的代码A
val r: Result<Unit> = Result.success(Unit).map { Result.success(Unit) }
不可编译的代码B
val r: Result<Int> = Result.success(Unit).map { Result.success(1) }
核心规则说明
1. Result.map 函数签名
Result的map扩展函数签名如下:
inline fun <T, R> Result<T>.map(transform: (T) -> R): Result<R>
函数的返回值类型为Result<R>,R由传入的转换函数transform的返回值类型决定。
2. Kotlin Unit 类型的特殊隐式转换规则
当上下文明确预期返回类型为Unit时,Kotlin会自动忽略任意表达式的返回值,隐式返回Unit,无需显式声明。
代码A可编译的原因
代码A中变量r显式声明为Result<Unit>类型,编译器会反向推断map函数的泛型参数R为Unit,即要求传入的transform lambda返回Unit类型。
此时lambda内部最后一行的Result.success(Unit)表达式的返回值会被自动丢弃,lambda整体隐式返回Unit,完全符合map的参数要求,最终map输出Result<Unit>,和变量r类型匹配,因此编译正常。
代码B编译失败的对照说明
代码B中变量r显式声明为Result<Int>,编译器推断map的R参数为Int,要求transform lambda返回Int类型。但lambda最后一行返回的是Result<Int>,二者不存在隐式转换路径,类型不匹配,因此编译报错。
内容的提问来源于stack exchange,提问作者Yves Bonjour
相关产品推荐
相关产品推荐

