You need to enable JavaScript to run this app. Kotlin接入Android路由库Cicerone时的SAM接口类型不匹配问题
优惠活动
大模型
产品
解决方案
定价
更多

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入参对齐函数签名即可:

  1. 通用可读性写法
    object Screens {
        val launch = ActivityScreen { context ->
            LaunchActivity.getJumpIntent(context)
        }
    }
    
  2. 极简写法
    当lambda逻辑简单时,可直接用Kotlin的隐式入参it替代显式声明的context:
    object Screens {
        val launch = ActivityScreen { LaunchActivity.getJumpIntent(it) }
    }
    

注意:如果LaunchActivity中原本实现的伴生Intent生成方法是无参版本,仅靠全局单例Context生成跳转Intent,也需要显式接住Creator接口传入的Context参数,哪怕实际未使用该参数,否则依然会触发类型不匹配报错。

内容的提问来源于stack exchange,提问作者Hotshom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 04:12:16