You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin传递尾随Lambda:函数作为参数时类型不匹配问题求助

问题分析与解决

你的代码出现类型不匹配错误,核心原因是调用myMessage时的尾随lambda逻辑错误:你直接执行了showNameAndAge(2,"it"),这会返回一个String类型的结果,但myMessage的第三个参数要求传入的是**(Int,String)->String类型的函数**,而非函数执行后的结果,因此触发类型不匹配报错。

修正方案

方案1:直接传递函数引用(最简洁)

不需要额外写lambda,直接将showNameAndAge作为参数传入myMessage即可,这是Kotlin中传递函数类型参数的标准方式:

fun main() {
    myMessage(message = "Hello", a = 1, funAsParameter2 = showNameAndAge)
}

val showNameAndAge: (Int, String) -> String = { a, b -> "hello $a and $b" }

fun myMessage(message: String, a: Int, funAsParameter2: (Int, String) -> String) {
    println("$message + $a ${funAsParameter2(a, message)}")
}

方案2:使用尾随lambda封装函数调用

如果坚持要用尾随lambda的写法,需要让lambda接收(Int,String)类型的参数,再调用showNameAndAge:

fun main() {
    myMessage(message = "Hello", 1) { age, name ->
        showNameAndAge(age, name)
    }
}

val showNameAndAge: (Int, String) -> String = { a, b -> "hello $a and $b" }

fun myMessage(message: String, a: Int, funAsParameter2: (Int, String) -> String) {
    println("$message + $a ${funAsParameter2(a, message)}")
}

甚至可以用函数引用的简写形式替代lambda:

fun main() {
    myMessage(message = "Hello", 1) = showNameAndAge
}

运行结果

两种方案执行后都会输出:

Hello + 1 hello 1 and Hello

内容的提问来源于stack exchange,提问作者yardımcı Etis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:01:15