简洁版
我想要一个返回签名为LiveData<User>
的方法,其中User
是一个接口。实现应该返回LiveData<UserEntity>
,而UserEntity
是一个继承了User
的具体类。像下面这样:fun getUser(id: String): LiveData<User> {
// for brevity
return LiveData<UserEntity>() // actual code will retrieve data from db
}
编译器报错了,显示“返回类型不匹配错误”。
简短版
我正在阅读Jetpack指南。其中,他们设计了一个DataRepository
类,可以从数据库或Web服务中检索数据,如下图所示:
并且他们声称:
请注意,每个组件仅依赖于其下一级组件。
这是一个有吸引力的设计,我实际上尝试在自己的项目中复制它。 然而,我发现WebService
无法避免依赖于Room
,因为它的方法getUser()
返回User
的LiveData
,它是一个Room实体。
这个问题可能不会破坏应用程序,但它与“关注点分离”原则的基本设计相矛盾,并且在我看来不美观。
我的问题是:是否有任何解决方法? 我已尝试将User
重构为接口,并实现一个扩展它的UserEntity
类。如下所示:
interface User {
val id: String
val name: String
val lastName: String
}
@Entity(tableName="users")
data class UserEntity(
override val id: String
override val name: String
override val lastName: String) : User
@Dao
interface UserDao() {
@Query("SELECT * FROM users where id = :id")
fun getUser(id: String): LiveData<UserEntity> // UserEntity instead of User, because Room doesn't know how to construct an interface
}
请注意,我需要返回
UserEntity
而不是User
,因为Room不知道如何构造一个接口。问题在于以下代码无法编译:
interface DataRepository {
fun getUser(id: String): LiveData<User>
}
class DbRepository : DataRepository {
// ... init db connection/userDao ...
override fun getUser(id: String): LiveData<User> = userDao.getUser(id)
}
错误提示表示数据类型不匹配:LiveData<User> 与 LiveData<UserEntity>。