Android Kotlin中Moshi.adapter()与文档签名不符编译报错求助
Moshi在Android非主模块用不了泛型
adapter<T>()?原因和解决办法都在这 问题根源
- 缺Kotlin反射依赖:Moshi的
moshi.adapter<T>()泛型方法需要Kotlin反射库解析泛型类型,但Android项目(尤其是非主模块)默认不会自带这个库。文档示例默认是针对JVM后端环境编写的,这类环境反射是标配,自然不用额外配置。 - 非主模块KSP配置不全:你虽然加了KSP依赖,但非主模块得单独应用KSP插件,否则代码生成的适配器不会生效——没了生成的适配器,又没反射库兜底,自然找不到匹配的重载方法。
- 你之前用
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生成专用适配器,步骤如下:
- 非主模块的
build.gradle中必须应用KSP插件:
plugins { id 'com.android.library' // 非主模块为library时用这个 id 'org.jetbrains.kotlin.android' id 'com.google.devtools.ksp' // 必须添加,否则KSP不生成代码 }
- 给
Blob类添加注解,触发KSP生成适配器:
import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) class Blob(val string: String)
- 之后获取适配器就完全正常了,两种方式任选:
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
相关产品推荐
相关产品推荐

