在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>

  • 类型不匹配:推断类型是FragmentActivity? 但是在将支持库更新到27.0.0时预期上下文
  • 传入参数时Kotlin类型不匹配
  • Kotlin,如何获得searchView提交
  • Android SDK类上的Kotlin扩展函数的单元测试
  • 是否有一种方法要求泛型类型是Kotlin中的数据类?
  • 如何将函数引用保存为Map类型的值,然后在Kotlin中用参数调用它?
  • Kotlin协同程序如何比RxKotlin更好?
  • 我怎样才能在Kotlin中得到一个随机数字?
  • 如何用Kotlin interop强制执行泛型
  • Google Guava Invokedynamic要求--min-sdk-version> = 26
  • 用kotlin改造,无法创建@Body
  • Kotlin language will be the best programming language for Android.