gpt4 book ai didi

android - 在 Kotlin 中使用 TypeAdapter 实现 TypeAdapterFactory

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:46 26 4
gpt4 key购买 nike

我正在尝试用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com