У меня есть база данных Room для моего приложения Android. Мой 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 имеют гораздо больше, чем только эти дваfunctions.
Я узнал о делегировании классов, чтобы включить композиционное наследование. Таким образом, я пытаюсь уменьшить шаблон в MyRepo, передав ему простые функции, которые просто вызывают функцию дао и возвращают возвращаемое значение дао. Это имеет смысл, что я должен сделать:
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
? Или есть способ сделать это?
Я пытался переопределить функции BaseDao в MyRepo, думая, что это перестанет жаловаться на FooEntity и BarEntity:
class MyRepo(...): BaseDao<Any>, SetDao by setDao, ... {
override fun insert(t: Any): Long = 0L
}
, но это просто добавляет "Любой"к сообщению о несовместимых типах.