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
相关产品推荐
相关产品推荐

