如何向Lambda传递2个参数作为函数参数?解决解构声明编译错误
Kotlin Lambda参数解构引发的编译错误解决
问题场景
定义了如下函数:
fun foo(arg1: Int, arg2: String, lambda: (String, Int) -> Int): Int { return arg1 + arg2.length + lambda("123", 1) }
调用时尝试用带括号的lambda参数写法,出现编译错误:
fun bar() { foo(1, "2") { (a, b) -> 42 } }
报错信息:
Expected 2 parameters of types String, Int
Destructuring declarations initializer of type String must have a 'component1()' function
显式指定类型后仍报错:
fun bar() { foo(1, "2") { (a:String, b:Int) -> 42 } }
报错信息:
required (String,Int) -> Int
but found: (String) -> Int
错误原因
你给lambda参数套了括号,触发了Kotlin的解构声明语法:
- 编译器会认为这个lambda只接收一个参数,然后尝试把这个参数解构为
a和b。但你的lambda需要接收两个独立的参数(String和Int),所以编译器会把传入的第一个String类型参数当成解构目标,而String没有component1()和component2()方法,因此抛出第一个错误。 - 即使显式指定类型,编译器依然认定你要解构单个String参数,推断出的lambda类型是
(String) -> Int,和函数要求的(String,Int)->Int不匹配,导致第二个错误。
正确写法
去掉参数外层的括号,直接声明两个独立参数即可:
fun bar() { foo(1, "2") { a, b -> 42 } }
如果需要显式指定参数类型,正确写法是:
fun bar() { foo(1, "2") { a: String, b: Int -> 42 } }
补充说明
只有当lambda接收的是可解构对象(比如Pair、数据类)时,才需要用括号做解构声明。例如lambda参数是Pair<String, Int>时,写法才是{ (a, b) -> ... },但本场景中lambda是接收两个独立参数,因此不需要括号。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

