我在构建我的Retrofit实例时注册了一个TypeAdapter,该实例委托所有期望List响应的API调用:
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(User,需要自定义反序列化器),但我希望能够调用返回不同类型的列表(比如Item,它会自动反序列化) )。问题是我不能指定MatchesDeserializer应该用于哪种List类型,因为类文字不能包含类型信息。我们可以为没有问题的数组响应指定类型。
GsonBuilder().registerTypeAdapter(List<String>::class.java, MatchesDeserializer()) //This doesn't compile.
我可以更改所有希望List返回JsonObject的调用,并使用我的反序列化器手动解析它,或者实现TypeAdapterFactory以手动反序列化用户类型。
有更优雅的方法吗?