Kotlin 1.6升级后Android Room协程suspend DAO方法返回类型转换错误
Kotlin 1.6升级后Room DAO suspend查询方法报错解决方案
根因说明
该问题由Room版本与Kotlin 1.6的兼容性问题导致。Kotlin 1.6调整了挂起函数的字节码生成规则,2.4.0以下版本的Room无法正确识别suspend修饰的DAO方法的返回类型,因此抛出无法将Cursor转换为Object类型的错误。
可行解决方案
- 方案1(优先推荐):升级Room版本到2.4.0及以上
修改项目依赖配置即可,无需调整原有DAO代码,参考gradle配置:
dependencies { def room_version = "2.5.0" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" }
如果项目使用KSP替代KAPT做注解处理,将compiler的依赖替换为ksp "androidx.room:room-compiler:$room_version"即可。
- 方案2(临时兼容):回退Kotlin挂起函数字节码规则
如果暂时无法升级Room版本,可在模块级build.gradle中添加编译器参数,复用Kotlin 1.5的字节码生成逻辑:
kotlinOptions { freeCompilerArgs += [ "-Xno-optimized-callable-references", "-Xuse-old-inner-classes-logic" ] }
该方案为临时兼容手段,后续仍建议升级Room版本避免其他潜在兼容性问题。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

