Kotlin接入Android路由库Cicerone时的SAM接口类型不匹配问题
Cicerone路由库Kotlin开发类型不匹配问题解决
报错详情
编译阶段抛出类型不匹配错误:Type mismatch. Required: Creator<Context, Intent>,Found: () → Intent
现有实现的问题梳理
- 开发者参考公开资料编写
Screens单例类,在launch方法中通过无参lambda传入LaunchActivity的跳转Intent - 在
LaunchActivity中实现了生成跳转Intent的伴生方法 - 对照Cicerone源码可知,
ActivityScreen构造函数需要接收Creator<Context, Intent>类型的intentCreator参数,Creator为单方法函数式接口 - 临时采用匿名对象实现
Creator接口的写法虽可正常运行,但代码过于繁琐,不符合Kotlin的语法特性
报错核心原因
Creator<Context, Intent>函数式接口的方法签名为fun create(context: Context): Intent,对应匹配的Kotlin函数类型为(Context) -> Intent。初始实现中传入的无参lambda() -> Intent缺失了必须的Context入参,和目标类型的函数签名不匹配,因此触发编译报错。
简洁实现方案
借助Kotlin对Java函数式接口的SAM转换机制,无需手写匿名对象实现,仅需补全lambda入参对齐函数签名即可:
- 通用可读性写法
object Screens { val launch = ActivityScreen { context -> LaunchActivity.getJumpIntent(context) } } - 极简写法
当lambda逻辑简单时,可直接用Kotlin的隐式入参it替代显式声明的context:object Screens { val launch = ActivityScreen { LaunchActivity.getJumpIntent(it) } }
注意:如果
LaunchActivity中原本实现的伴生Intent生成方法是无参版本,仅靠全局单例Context生成跳转Intent,也需要显式接住Creator接口传入的Context参数,哪怕实际未使用该参数,否则依然会触发类型不匹配报错。
内容的提问来源于stack exchange,提问作者Hotshom
相关产品推荐
相关产品推荐

