我已经为我的Android应用程序创建了一个Room数据库。My 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不仅仅有这两个函数。
我已经了解了如何使用类委托来实现组合继承。因此,我试图减少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
}
但这只是在不一致类型消息中添加了"Any“。
发布于 2020-05-06 04:52:10
我也面临着同样的问题,并用注解替换了泛型类。
我们最近发布了我们的库LivingRoom
您只需使用适当的注释标记实体类(@Insertable、@Deletable、@Updatable、@Selectable ...)
https://stackoverflow.com/questions/58351265
复制相似问题