Kotlin为接口添加柯里化扩展函数编译器无法识别问题
问题1:该行为是否符合Kotlin的设计预期?
完全符合。Kotlin函数重载解析规则明确约定:同名函数的匹配优先级为 成员函数 > 扩展函数。
你调用a.myFun { }时,编译器会优先匹配接口A的内置成员方法myFun,该方法要求入参是(String, Int) -> Unit类型的双参数Lambda,而你传入的空Lambda{}会被默认推断为无参的() -> Unit,类型不匹配直接报错,编译器不会再检索优先级更低的扩展函数。
问题2:实现仅定义一个参数且支持隐式it的方案
有两种常用的可行方案:
方案1:调用时显式触发单参数Lambda推断
双参数Lambda不存在隐式it,只要你在Lambda中使用it,编译器就会自动推断你需要的是单参数Lambda,此时会跳过不匹配的成员函数,正确匹配你定义的扩展函数:
// 可正常编译,it会被自动推断为String类型 a.myFun { println(it) } // 无业务逻辑仅占位时,也可以写成如下形式明确告知编译器这是单参数Lambda a.myFun { it }
方案2:扩展函数重命名(更推荐)
直接给扩展函数设置和成员函数不同的名称,从根源上避免重载解析优先级冲突,可读性和稳定性更高:
// 扩展函数改名 fun A.myFunSingle(callback: (String) -> Unit) = this.myFun { c, _ -> callback(c)} // 调用时直接使用新名称,天然支持隐式it a.myFunSingle { println(it) }
内容的提问来源于stack exchange,提问作者Mikhail Bolotov
相关产品推荐
相关产品推荐

