gpt4 book ai didi

generics - 实现 BaseDao 的多个 Daos 的存储库类委托(delegate) - 可能吗?

转载 作者:行者123 更新时间:2023-12-02 11:52:21 25 4
gpt4 key购买 nike

我的 Android 应用程序有一个 Room 数据库。我的 FooDao 和 BarDao 都实现了 BaseDao:

interface BaseDao<T> {
@Insert
fun insert(obj: T): Long
@Update
fun update(obj: T)
}

@Dao
interface FooDao: BaseDao<FooEntity> {
@Query("some query")
fun doSomethingWithFoo()
}

@Dao
interface BarDao: BaseDao<BaseEntity> {
@Query("some other query")
fun doSomethingWithBar()
}

我也有一个存储库类:
class MyRepo(private val fooDao: FooDao, private val barDao: BarDao) {
fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
fun doSomethingWithBar() = barDao.doSomethingWithBar()
}

但是想象一下,FooDao、BarDao 和 MyRepo 不仅仅是这两个功能。

我已经了解了类委托(delegate)以启用组合继承。因此,我试图通过委托(delegate)简单的函数来减少 MyRepo 中的样板,这些函数只调用 dao 的函数并返回 dao 的返回值。我应该这样做是有道理的:
class MyRepo(...): FooDao by fooDao, BarDao by barDao {
//fun doSomethingWithFoo no longer necessary
//fun doSomethingWithBar no longer necessary
}

然而,Android Studio 给了我一个红色波浪状的说法 Type parameter T of BaseDao has inconsistent values: FooEntity, BarEntity
这是否意味着减少所有像 MyRepo.doSomethingWithFoo = fooDao.doSomethignWithFoo 这样的样板文件的所有希望都消失了?或者有没有办法做到这一点?

我试图实际上覆盖 MyRepo 中的 BaseDao 函数,认为它会停止提示 FooEntity 和 BarEntity:
class MyRepo(...): BaseDao<Any>, SetDao by setDao, ... {
override fun insert(t: Any): Long = 0L
}

但这只是将“任何”添加到不一致的类型消息中。

最佳答案

我遇到了同样的问题,并用注释替换了泛型类。

我们最近发布了我们的库 LivingRoom

您只需使用适当的注释(@Insertable、@Deletable、@Updatable、@Selectable ...)标记您的实体类

关于generics - 实现 BaseDao 的多个 Daos 的存储库类委托(delegate) - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com