特定返回Lambda类型为何引发Kotlin函数重载歧义?
为什么这段Kotlin代码的函数调用会出现歧义?
先把你的代码整理清楚:
fun <P1, R> test(init: () -> (P1) -> R) { } fun <P1, P2, R> test(init: () -> (P1, P2) -> R) { } fun main() { test { fun(p1: Long) { } } }
你觉得返回的单参数函数只能匹配第一个test,但编译器之所以报歧义,核心是你忽略了Kotlin的函数类型兼容性规则:
- 你在lambda里定义的函数
fun(p1: Long) {},类型是(Long) -> Unit(因为没有显式返回值,默认返回Unit)。 - 对于第二个
test函数来说,它要求init返回(P1, P2) -> R。当R=Unit时,Kotlin允许把(Long) -> Unit适配成(Long, P2) -> Unit——因为调用这个函数时,额外的参数会被直接忽略,语法上是合法的。 - 此时两个
test函数都能被类型推导匹配:- 第一个
test:P1=Long,R=Unit,完全匹配返回的单参数函数。 - 第二个
test:P1=Long,P2可以是任意合法类型(比如Nothing?),R=Unit,同样符合要求。
- 第一个
编译器无法判断你到底想调用哪一个,所以报出歧义错误。
你在语义上的误解是:默认认为单参数函数只能对应单参数的函数类型,但在Kotlin中,返回Unit的函数可以兼容参数更多的函数类型——只要额外的参数在调用时可以被忽略,这种适配就是允许的。
内容的提问来源于stack exchange,提问作者FatalCatharsis
相关产品推荐
相关产品推荐

