Kotlin Retrofit2项目出现Not enough information to infer variable T错误如何解决
问题根因
- 第一,
emptyList1()大概率是你对Kotlin标准库emptyList<T>()的笔误,该函数需要指定泛型参数T才能确定返回的列表类型,你没有指定泛型,编译器无法推断T的类型,就抛出了「Not enough information about variable T」的错误。 - 第二,你把空列表强转为
QuoteModel的逻辑本身就是错误的,空列表是List类型,和QuoteModel没有继承关系,就算编译通过运行时也会直接抛出ClassCastException崩溃。
解决方案
Kotlin没有内置的通用单个空对象实现,针对你的场景有两种可行方案:
方案1:使用可空类型(更推荐)
按ID查询用户本身就存在查不到的场景,返回可空类型更符合业务逻辑和Retrofit的设计习惯。
修改Provider代码:
@Singleton class QuoteProvider @Inject constructor() { // 修正笔误,用标准库emptyList,编译器自动推断泛型为List<QuoteModel> var allUsers: List<QuoteModel> = emptyList() // 改为可空类型,初始值设为null var userById: QuoteModel? = null }
修改Service代码:
suspend fun getUserById(id:Number): QuoteModel?{ return withContext(Dispatchers.IO){ val response = api.getUserById(id) // 查不到直接返回null即可 response.body() } }
方案2:实现空对象模式(适合必须返回非空的场景)
如果你的业务逻辑要求必须返回非空的QuoteModel,可以给QuoteModel预定义一个空对象实例。
先给Model类添加空对象常量:
data class QuoteModel( @SerializedName("id") val quote: Number, @SerializedName("name") val name: String, @SerializedName("email") val email: String, @SerializedName("address") val addrees: String, @SerializedName("phone") val phone: String, @SerializedName("website") val website: String, @SerializedName("company") val company: String, ) { // 全局复用的空对象实例,字段按需填默认值 companion object { val EMPTY = QuoteModel( quote = -1, name = "", email = "", addrees = "", phone = "", website = "", company = "" ) } }
修改Provider代码:
@Singleton class QuoteProvider @Inject constructor() { var allUsers: List<QuoteModel> = emptyList() var userById: QuoteModel = QuoteModel.EMPTY }
修改Service报错行:
response.body() ?: QuoteModel.EMPTY
其他注意事项
你代码中api.getAllUUsers()的方法名大概率也是拼写错误,建议核对QuoteApiClient中的接口定义避免后续调用出错。
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

