我有几个房间实体(WEntity
)和相应的非房间模型(WModel
)。
将Room实体内部连接起来以创建层次结构(WHierarchy
)(祖父母->列表(父)->列表(子代)-> ...)。
我需要能够将实体转换为相应的模型,并将层次结构转换为相应的模型。 (例如,FooModel
具有FooEntity
数据以及BarModels
的列表(从BarEntity
映射)。
例如,我目前将此层次结构表示为FooHierarchy(val parent: FooEntity, val children: List<BarEntity>)
。
这是我的初始界面,描述了他们[[应该尽力而为:
interface WModel
interface WEntity<T: WModel> {
fun toModel(): T
}
abstract class WHierarchy<Parent: WEntity<ParentModel>, Child: WEntity<ChildModel>, ParentModel: WModel, ChildModel: WModel> {
abstract val parent: Parent
abstract val children: List<Child>
fun toModel(): ParentModel {
return when(this) {
is WOHierarchy -> parent.toModel().copy(lgs=children.map { it.toModel() })
else -> throw IllegalStateException("bork bork bork")
}
}
}
以下是示例实体:
data class WOEntity(val id: Int): WEntity<WO> { override fun toModel(): WO { return WO(id=id, lgs=emptyList()) } } data class LGEntity(val id: Int): WEntity<LG> { override fun toModel(): LG { return LG(id=id) } }
及其对应的模型:
data class WO(val id: Int, val lgs: List<LG>): WModel data class LG(val id: Int): WModel
和层次结构:
data class WOHierarchy(override val parent: WOEntity, override val children: List<LGEntity>): WHierarchy<WOEntity, LGEntity, WO, LG>()
我遇到的问题是抽象类
WHierarchy
。当前的实施标记parent.toModel().copy(lgs=children.map { it.toModel() })
并说“类型不匹配:必需:ParentModel。找到:WO。”
我很困惑:WO实现了ParentModel!我该如何解决?编译器不应该知道WO实现了ParentModel,因此我要像我应该的那样返回ParentModel吗?这都是试图抽象掉
Hierarchy
的toModel()
(最终是伴随对象的fromModel()
),因为我实际上以完全相同的方式拥有四个或五个层次结构实现类,所以这很像样板,相同的关键字,只是不同的返回类(因此WModel接口不执行任何操作)。
WOHierarchy -> parent.toModel()
编译器知道parent.toModel()函数返回WO
,并且Parent类型为WOEntity
。并且您告诉他抽象类模型函数内的返回类型为Parent
,您需要在抽象类中进行更改fun toModel(): WModel
-
abstract class WHierarchy<Parent : WEntity<ParentModel>, Child : WEntity<ChildModel>, ParentModel : WModel, ChildModel : WModel> { abstract val parent: Parent abstract val children: List<Child> fun toModel(): WModel { return when (this) { is WOHierarchy -> parent.toModel().copy(lgs = children.map { it.toModel() }) else -> throw IllegalStateException("bork bork bork") } } }