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

Android Epoxy库中lambda参数类型看似不匹配却正常运行的原因是什么?

核心原因

这是Kotlin函数类型的标准语法特性,你的写法不存在类型不匹配,属于合法用法。

具体逻辑说明

  1. 变量类型完全匹配
    你代码中两处涉及的函数类型完全一致:
  • EpoxyRoutineModel 中声明的listener属性类型为 (Int) -> Unit,代表接收一个Int参数、无返回值的函数类型对象
  • RoutineItemController 构造参数中的addDetailClicked类型同样为 (Int) -> Unit
    同类型的变量可以直接互相赋值,不需要额外包装。
  1. 你误解的两种写法的适用场景
  • 你以为需要写的listener(Int)属于调用函数类型对象的写法,作用是当场执行该函数的逻辑,而你当前的需求是给listener属性赋值、保存这个回调待后续点击时触发,这种写法和你的需求完全不匹配。
  • 你提到的listener({ i -> addDetailClicked(i) })属于额外创建了一层匿名lambda,将接收的Int参数转发给addDetailClicked执行,属于冗余代码,效果和直接传addDetailClicked完全一致,没有必要多做一层包装。
  1. 函数引用的补充说明
    你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:45:03