在Kotlin中使用TypeAdapter实现TypeAdapterFactory

我正在尝试在我的android项目中使用Kotlin语言实现一些特定的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的参数的原因不在此问题的上下文中。

One Solution collect form web for “在Kotlin中使用TypeAdapter实现TypeAdapterFactory”

这是不可能的,因为您覆盖的方法( TypeFactory.create )没有上限(在Kotlin中转换为<T : Any> )。 在你的create方法中, T不能保证是一个Enum<T> (所以,不可能把它作为参数传递给你的适配器)。

你可以做的只是删除你的适配器类的上限,并保持私有,以确保只有你的工厂可以创建它的实例(和工厂已经验证,如果类型是一个枚举)。

 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") } } } 

classOfTClass<in T>Class<in T>因为TypeToken.rawType()返回Class<? super T>

  • 使用Gradle Kotlin配置Maven插件
  • 在Kotlin中,我如何传递一个参数,使异步范围能够节约呢?
  • 如何在同一个src文件夹中运行不同的.kt文件/类?
  • Android Studio 3.0 Kotlin的变化并没有体现在构建中
  • Kotlin - 如何查找列表中的重复值的数量?
  • 未解决的参考:数据绑定
  • kapt是否支持maapt?
  • Recyclerview查看共享状态
  • Kotlin反射+泛型
  • Android Firestore微调不加载我的文档
  • Kotlin - 非法使用内联参数回调
  • Kotlin language will be the best programming language for Android.