- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试用 Kotlin 语言为我的 android 项目实现一些特定的 GSON TypeAdapter。
我面临的问题是无法推断类型的编译错误:Type inference failed: 'T' cannot capture 'in (T..T?'. Type parameter has an upper bound 'Enum<T>' that cannot be satisfied capturing 'in' projection
代码如下:
class SmartEnumTypeAdapterFactory(fallbackKey: String) : TypeAdapterFactory {
private val fallbackKey = fallbackKey.toLowerCase(Locale.US)
override fun <T : Any> create(gson: Gson?, type: TypeToken<T>): TypeAdapter<T>? {
val rawType = type.rawType
return if (!rawType.isEnum) null else SmartEnumTypeAdapter(rawType)
}
class SmartEnumTypeAdapter<T : Enum<T>>(classOfT: Class<T>) : TypeAdapter<T>() {
override fun write(out: JsonWriter?, value: T) {
TODO("not implemented")
}
override fun read(`in`: JsonReader?): T {
TODO("not implemented")
}
}
}
我想要拥有的原因classOfT: Class<T>
因为 TypeAdapter 的参数不在这个问题的上下文中。
最佳答案
这是不可能的,因为您要覆盖的方法 ( TypeFactory.create
) 没有上限(在 Kotlin 中转换为 <T : Any>
)。在你的create
方法,T
不是保证是 Enum<T>
(因此,不可能将它作为参数传递给您的适配器)。
您可以做的是简单地删除适配器类中的上限并将其保持私有(private)以确保只有您的工厂可以创建它的实例(并且工厂已经验证类型是否为枚举)。
class SmartEnumTypeAdapterFactory(fallbackKey: String) : TypeAdapterFactory {
private val fallbackKey = fallbackKey.toLowerCase(Locale.US)
override fun <T> create(gson: Gson?, type: TypeToken<T>): TypeAdapter<T>? {
val rawType = type.rawType
return if (!rawType.isEnum) null else SmartEnumTypeAdapter(rawType)
}
private class SmartEnumTypeAdapter<T>(classOfT: Class<in T>) : TypeAdapter<T>() {
override fun write(out: JsonWriter?, value: T) {
TODO("not implemented")
}
override fun read(`in`: JsonReader?): T {
TODO("not implemented")
}
}
}
(classOfT
是一个 Class<in T>
因为 TypeToken.rawType()
返回一个 Class<? super T>
)
关于android - 在 Kotlin 中使用 TypeAdapter 实现 TypeAdapterFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46794678/
据我所知,最灵活的 gson 定制可以通过 TypeAdapterFactory 实现,但是它可能会变得不必要地复杂。它迫使我为每个处理的类编写 read 和 write,而有时实际上只需要一种方法。
我正在尝试使用 lambda 表达式来简化下面的代码片段。可以在此处找到详细信息:Could not serialize object cause of HibernateProxy . public
如何实现类型 TypeAdapterFactory在 Gson ? create 的主要方法是泛型的。为什么? 注册方法registerTypeAdapterFactory()不接收类型参数。那么,G
我正在尝试用 Kotlin 语言为我的 android 项目实现一些特定的 GSON TypeAdapter。 我面临的问题是无法推断类型的编译错误:Type inference failed: 'T
让我们从分享工作和可复制代码开始(需要谷歌gson包): package mypackage; import com.google.gson.Gson; import com.google.gson.
我只是想用 vaadin 图表实现简单的条形图。就像下面的教程一样,我编写了代码。 链接:http://demo.vaadin.com/charts/#BasicBar 但是当我尝试扩展时,由于没有这
我正在尝试为我正在使用的 JavaFX 类型(不同的属性和可观察值)编写一个 TypeAdapterFactory。对于 ObjectProperty,我可以编写一个 JsonSerializer/D
我是一名优秀的程序员,十分优秀!