Внедрение TypeAdapterFactory с помощью TypeAdapter в Котлине

Я пытаюсь реализовать какой-то конкретный GSON TypeAdapter на языке Kotlin для моего проекта Android.

Проблема, с которой я столкнулся, – это ошибка компиляции с невозможностью вывести тип: Ошибка ввода 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 ), не имеет верхней границы (что означает <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") } } } 

( classOfT – это Class<in T> потому что TypeToken.rawType() возвращает Class<? super T> )