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

Android Kotlin中Moshi.adapter()与文档签名不符编译报错求助

Moshi在Android非主模块用不了泛型adapter<T>()?原因和解决办法都在这

问题根源

  1. 缺Kotlin反射依赖:Moshi的moshi.adapter<T>()泛型方法需要Kotlin反射库解析泛型类型,但Android项目(尤其是非主模块)默认不会自带这个库。文档示例默认是针对JVM后端环境编写的,这类环境反射是标配,自然不用额外配置。
  2. 非主模块KSP配置不全:你虽然加了KSP依赖,但非主模块得单独应用KSP插件,否则代码生成的适配器不会生效——没了生成的适配器,又没反射库兜底,自然找不到匹配的重载方法。
  3. 你之前用typeOf的方式错误:typeOf<Blob>().javaClass拿到的是KType自身的Class,不是Blob的类型信息,就算传进去也没用,正确用法是直接传typeOf<Blob>(),但前提还是得有反射库支持。

解决办法

办法1:补加Kotlin反射依赖

在非主模块的build.gradle中添加反射依赖,注意版本要和你项目使用的Kotlin版本保持一致:

dependencies {
    // 保留原有依赖,新增以下一行
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.9.0'
}

添加后,原代码的moshi.adapter<Blob>()就能正常编译,反射库会帮Moshi解析泛型类型。

办法2:用KSP生成适配器(推荐,无反射开销)

反射会增加包体积且影响启动速度,更优方案是用KSP生成专用适配器,步骤如下:

  1. 非主模块的build.gradle中必须应用KSP插件:
plugins {
    id 'com.android.library' // 非主模块为library时用这个
    id 'org.jetbrains.kotlin.android'
    id 'com.google.devtools.ksp' // 必须添加,否则KSP不生成代码
}
  1. 给Blob类添加注解,触发KSP生成适配器:
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
class Blob(val string: String)
  1. 之后获取适配器就完全正常了,两种方式任选:
internal object JsonMan {
    val moshi = Moshi.Builder()
        .addLast(KotlinJsonAdapterFactory())
        .build()

    // 方式1:直接用KSP生成的BlobJsonAdapter类
    val blobAdapter = BlobJsonAdapter(moshi)
    // 方式2:仍用moshi.adapter,此时Moshi会自动找到生成的适配器,无需反射
    val mapAdapter = moshi.adapter<Blob>()
}

为啥文档的代码直接用不了?

Moshi官方文档的示例大多面向后端Kotlin项目,JVM后端环境默认自带Kotlin反射库,无需额外配置。但Android环境(尤其是非主模块)有包体积限制,默认不会引入反射库;且非主模块的依赖、插件配置不会自动继承主模块,必须单独配置,这就导致文档里的代码直接抄到Android非主模块会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:34:52