对于名单科特林GSON定制解串器

Mamykin安德烈:

如何注册自定义的Json解串器在GSON?

当我注册Java代码解串器都工作正常,但是当我转换科特林到Java - 解串器方法不会被调用。

科特林注册代码:

val listType: Type = object : TypeToken<List<Advert>>() {}.type
val gson = GsonBuilder()
           .registerTypeAdapter(listType, deserializer)

val retrofit = Retrofit.Builder()
               .addConverterFactory(GsonConverterFactory.create(gson))

Java代码:

Type listType = new TypeToken<List<Advert>>() {}.getType();
Gson gson = new GsonBuilder()
            .registerTypeAdapter(listType, deserializer)

Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))

解串器的声明:

class AdvertsDeserializer : JsonDeserializer<List<Advert>> {
override fun deserialize(json: JsonElement?, typeOfT: Type?,
                         context: JsonDeserializationContext?): List<Advert> {

方法调用

// list is List<Advert>
service.getAdverts()
            .subscribe({
                list ->
                viewState.showAdvertsList(list)
            }, {
                error ->
                error.printStackTrace()
            })

据我了解 - 在类型JSON对象(listType)的问题,还是什么,我做错了什么?

Miha_x64:

问题是,科特林编译器看到的List像一个协变的泛型类型List<out T>和编译及其实例作为通配符类型,即List<CharSequence>被编译成List<? extends Charsequence>

的解决方法是,使用MutableList其是invatiant

object : TypeToken<MutableList<Advert>>() {}.type

或supperss通配符代

object : TypeToken<List<@JvmSuppressWildcards Advert>>() {}.type

更多信息:科特林泛型。方差

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章