Я регистрирую TypeAdapter, когда создаю свой экземпляр Retrofit, который делегирует все вызовы API, ожидающие ответа List:
val retrofit = Retrofit.Builder()
.client(client)
.baseUrl("$baseURL/")
.addConverterFactory(
GsonConverterFactory.create(
GsonBuilder().registerTypeAdapter(List::class.java, MatchesDeserializer()) //Delegates all calls expecting return of type List.
.registerTypeAdapter(Array<String>::class.java, PhotoDeserializer()) //This works, because it's a different type.
.registerTypeAdapter(Triple::class.java, ChatMessagesDeserializer())
.create()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
.build()
В настоящий момент единственные вызовы, которые я выполняю, ожидают List того же типа (Пользователь, что требует пользовательского десериализатора), но я хочу иметь возможность делать вызовы, возвращающие списки разных типов (скажем, Item, который автоматически десериализуется).Проблема в том, что я не могу указать, для какого типа списка должен использоваться MatchesDeserializer, так как литерал класса не может включать информацию о типе.Мы можем указать тип ответа Array без проблем.
GsonBuilder().registerTypeAdapter(List<String>::class.java, MatchesDeserializer()) //This doesn't compile.
Я мог бы изменить все вызовы, ожидающие, что List вернет JsonObject, и проанализировать его вручную с помощью моего десериализатора, или реализовать TypeAdapterFactory длявручную десериализовать только пользовательские типы.
Есть ли более элегантный способ сделать это?