Android Epoxy库中lambda参数类型看似不匹配却正常运行的原因是什么?
核心原因
这是Kotlin函数类型的标准语法特性,你的写法不存在类型不匹配,属于合法用法。
具体逻辑说明
- 变量类型完全匹配
你代码中两处涉及的函数类型完全一致:
EpoxyRoutineModel中声明的listener属性类型为(Int) -> Unit,代表接收一个Int参数、无返回值的函数类型对象RoutineItemController构造参数中的addDetailClicked类型同样为(Int) -> Unit
同类型的变量可以直接互相赋值,不需要额外包装。
- 你误解的两种写法的适用场景
- 你以为需要写的
listener(Int)属于调用函数类型对象的写法,作用是当场执行该函数的逻辑,而你当前的需求是给listener属性赋值、保存这个回调待后续点击时触发,这种写法和你的需求完全不匹配。 - 你提到的
listener({ i -> addDetailClicked(i) })属于额外创建了一层匿名lambda,将接收的Int参数转发给addDetailClicked执行,属于冗余代码,效果和直接传addDetailClicked完全一致,没有必要多做一层包装。
- 函数引用的补充说明
你在WriteRoutineFragment中传入的::addDetail是Kotlin的函数引用,只要原函数的签名和目标函数类型完全匹配(addDetail接收Int参数、无返回值,和(Int) -> Unit完全匹配),就可以直接赋值给对应的函数类型变量,这也是Kotlin的标准语法特性。
简单示例辅助理解
// 声明第一个函数类型变量 val funcA: (Int) -> Unit = { println("输入值:$it") } // 同类型直接赋值,完全合法 val funcB: (Int) -> Unit = funcA // 冗余包装写法,效果和上面完全一致,没有必要 val funcC: (Int) -> Unit = { i -> funcA(i) } // 执行效果完全相同 funcA(1) // 输出 输入值:1 funcB(1) // 输出 输入值:1 funcC(1) // 输出 输入值:1
内容的提问来源于stack exchange,提问作者ybybyb
相关产品推荐
相关产品推荐

