У меня есть базовый класс, который я планирую использовать для загрузки некоторых данных с сервера:
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
базовому типу
. Есть ли способ реализовать эту иерархию классов без приведения классов илилучший способ реализовать это?