liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.9k stars 214 forks source link

NetConverte.onConvert 由于没有 reified 导致泛型无法拿到真实类型 #111

Closed cipchk closed 2 years ago

cipchk commented 2 years ago

问题描述

class LoveConverter : NetConverter {
    override fun <R> onConvert(succeed: Type, response: Response): R? {
         val turnsType = object : TypeToken<R>() {}.type
         return gson.fromJson<R>(response.body?.string(), turnsType)
         // todo: 如果我使用完整的类型,而非泛型是可以正常解析
         val turnsType = object : TypeToken<Page<Item>>() {}.type
         return gson.fromJson<R>(response.body?.string(), turnsType)
    }
}

以下相关调用:

data class Page<T>(
    val list: ArrayList<T>,
    val total: Int = 0,
)

data class Item(val id: Int)

scopeNetLife {
    Get<Page<Item>>("list").await()
}

抱歉,我对 KOTLIN 并不是很熟,能否有更好的办法呢?

liangjingkanji commented 2 years ago

kotlin的reified是在编译层面的泛型处理, 不能被封装的, 只能在inline中使用(所以是不可能做到接口回调传递"真实泛型")

如果想gson解析json使用succeed: Type即可, 具体请阅读demo中的GsonConverterFragment

cipchk commented 2 years ago

@liangjingkanji 我知道,但是对于 List 会被解析成 LinkedTreeMap,例如上述会被解析成:

Page(
  total = 0,
  list = LinkedTreeMap[]  而非 Item[]
)
cipchk commented 2 years ago

抱歉,是我自己应用上的问题,关闭。