use*_*450 5 generics kotlin android-room
我的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()
}
Run Code Online (Sandbox Code Playgroud)
我也有一个存储库类:
class MyRepo(private val fooDao: FooDao, private val barDao: BarDao) {
fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
fun doSomethingWithBar() = barDao.doSomethingWithBar()
}
Run Code Online (Sandbox Code Playgroud)
但是,可以想象FooDao,BarDao和MyRepo不仅具有这两个功能。
我已经了解了有关类委托以启用组合继承的知识。因此,我试图通过让MyRepo委托简单的函数来减少MyRepo的样板,这些简单函数仅调用dao的函数并返回dao的返回值。我应该这样做:
class MyRepo(...): FooDao by fooDao, BarDao by barDao {
//fun doSomethingWithFoo no longer necessary
//fun doSomethingWithBar no longer necessary
}
Run Code Online (Sandbox Code Playgroud)
但是,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
}
Run Code Online (Sandbox Code Playgroud)
但这只会在不一致的类型消息中添加“任何”。
小智 0
我遇到了同样的问题,并用注释替换了泛型类。
我们最近发布了我们的图书馆LivingRoom
您只需使用适当的注释标记您的实体类(@Insertable、@Deletable、@Updatable、@Selectable ...)
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |