Kotlin泛型在继承中的“输入”,“输出”用法

时间:2019-02-05 15:38:15

标签: generics kotlin

我有一个基类,我打算将其用于从服务器下载一些数据:

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通用声明中使用了 out 。但这在saveData(data: T)方法中引起问题。如果我使用不变性,则意味着在通用声明之前没有关键字,我将无法安全地将Processor的实现分配给基本类型

有没有一种方法可以在不进行类强制转换的情况下实现该类层次结构,或者什么是实现此目标的最佳方法?

1 个答案:

答案 0 :(得分:2)

这能给您想要的东西吗?

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

val processor: EntityProcessor<out BaseEntity> = ...