Пользовательский десериализатор Kotlin Gson для списка

Как зарегистрировать пользовательский десериализатор Json в Gson?

Когда я регистрирую десериализатор в java-коде, все работает нормально, но когда я конвертирую Kotlin в Java – метод десериализатора не вызывается.

Код регистрации Kotlin:

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), или что я делаю неправильно?

Проблема в том, что компилятор Kotlin добавляет подстановочный знак для List , то есть List<CharSequense> компилируется как List<? extends Charsequence> List<? extends Charsequence> .

Решением является либо использование MutableList

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

или подстановочный знак

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