如何在kotlin中推断泛型类型?(协方差问题)



我有两个扩展Data接口的类。

A: Data
B: Data

然后我有两个存储库。TestRepository是获取泛型类的接口。

TestRepository<T: Data> {
fun save(data: T): T
}
@Repository
ARepository: TestRepository<A> {
override fun save(data: A): A
}
@Repository
BRepository: TestRepository<B> {
override fun save(data: B): B
}

它都有保存方法,从泛型类型中获取数据,并返回泛型类型。

ARepo和BRepo从A:数据、B:数据中获取数据并返回相应的类型。

然后我们有了新的服务,

@Service
CService(
private aRepository: ARepository,
private bRepository: BRepository
) {
fun test(t: String): TestRepository<out Data> =
when (t) {
'1' -> aRepository
'2' -> bRepository
else -> throw Error("error")
}

}

它返回aRepository或bRepository,所以测试函数的返回类型是TestRepository<out Data>。但当我尝试将该类与DI、一起使用时

@Service
class TestClass(
private val cService: CService
) {
fun cServiceTest() {
...
val saveObject = Data('')
val repo = cService.test("1") // or "2"
repo.save(saveObject) <-- error
}
}

repo.save发出错误,

Type mismatch.
Required:
Nothing
Found:
Data

如何解决此错误?

这个怎么样


import kotlin.reflect.KClass

interface Data {
val name: String
}
data class A(
override val name: String = "A"
) : Data
data class B(
override val name: String = "B"
) : Data
interface DataRepository<T : Data> {
fun save(data: T): T
}
class ARepository : DataRepository<A> {
override fun save(data: A): A {
println("Saved - (A)")
return data.copy()
}
}
class BRepository : DataRepository<B> {
override fun save(data: B): B {
println("Saved - (B)")
return data.copy()
}
}
class DataService(
private val aClassRepository: ARepository = ARepository(),
private val bClassRepository: BRepository = BRepository(),
) {
@Suppress("UNCHECKED_CAST")
fun <T : Data> getRepository(_class: KClass<T>): DataRepository<T> =
when (_class) {
A::class -> aClassRepository
B::class -> bClassRepository
else -> throw RuntimeException()
} as? DataRepository<T> ?: throw RuntimeException()
}
fun main() {
val service = DataService()
val repository = service.getRepository(A::class)
val saved = repository.save(A())
println(saved)
}

我不知道你想解决什么样的问题。

所以我认为我提出的解决方案并不好。

相关内容

  • 没有找到相关文章

最新更新