我有一个 Retrofit 的默认响应类
open class DefaultResponseImpl : DefaultResponse {
override val error: List<RestError>? get() = meta?.listErrors
@Expose
var meta: Meta? = null
}
这个 Meta 可以有一些额外的字段,所以我想用这样的一些额外字段覆盖它
class SomeResponse : DefaultResponseImpl() {
@SerializedName("meta")
@Expose
val metaLocal: MetaInner? = null
inner class MetaInner : Meta() {
@SerializedName("extra_field")
@Expose
val field: Long? = null
}
}
但我收到错误 java.lang.IllegalArgumentException: Unable to create converter for class com.responses.SomeResponse
怎么了? MetaInner
是 Meta
的子类型,我不会用另一种类型覆盖旧的元字段(这会在 IDE 中出错)。我只是添加了另一个必须从同一个 SerializedName 解析的字段
这在 Kotlin 中如何实现?
最佳答案
我认为这取决于“元”键的冲突。 实际上 SomeResponse 类相当于这个类:
class SomeResponse : DefaultResponse {
override val error: List<RestError>? get() = meta?.listErrors
@Expose
var meta: Meta? = null
@SerializedName("meta")
@Expose
val metaLocal: MetaInner? = null
inner class MetaInner : Meta() {
@SerializedName("extra_field")
@Expose
val field: Long? = null
}
}
很容易观察到键 meta 用于变量 meta 和 metaLocal
您可以为两个请求使用一个唯一的类,使用泛型来传递 meta 属性的类型。
open class DefaultResponseImpl<T> : DefaultResponse {
override val error: List<RestError>? get() {
if (meta? is Meta?) return meta?.listErrors
return null
}
@Expose
var meta: T = null
}
关于android - Kotlin android 中的 GSON 序列化,覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49158475/