Использование дженериков kotlin "in", "out" в наследстве - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть базовый класс, который я планирую использовать для загрузки некоторых данных с сервера:

abstract class Processor<out T : BaseEntity> {
   fun loadData() {
      val data = fetchFromBackend()
      saveData(data)
   }

   // here I'll define specific logic of saving data
   // and here is my Error Type parameter T is declared as 'out' but occurs in 'invariant' position in type T
   abstract protected open fun saveData(data: T)

}

Затем у меня есть несколько реализаций этого класса Processor, и я использую их вот так

val processor: EntityProcessor<BaseEntity> = when(type){
               TypeA -> ProcessorImplementationA(...)
               TypeB -> ProcessorImplementationB(...)
               TypeC -> ProcessorImplementationC(...)

Чтобы можно было безопасно назначить реализацию процессора базовому типу, я использую из в T обобщенном объявлении.Но это вызывает проблему в методе saveData(data: T).Если я использую неизменность, означает отсутствие ключевого слова перед обобщенным объявлением, я не смогу безопасно назначить реализацию Processor базовому типу

. Есть ли способ реализовать эту иерархию классов без приведения классов илилучший способ реализовать это?

1 Ответ

0 голосов
/ 05 февраля 2019

Это дает вам то, что вы хотите?

abstract class Processor<T : BaseEntity> {...}

val processor: EntityProcessor<out BaseEntity> = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...