Kotlin高级键入:抽象类,减少将样板房间类转换为其他类的接口

问题描述 投票:0回答:1

我有几个房间实体(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吗?

这都是试图抽象掉HierarchytoModel()(最终是伴随对象的fromModel()),因为我实际上以完全相同的方式拥有四个或五个层次结构实现类,所以这很像样板,相同的关键字,只是不同的返回类(因此WModel接口不执行任何操作)。

generics kotlin
1个回答
0
投票
强制转换后为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") } } }

© www.soinside.com 2019 - 2024. All rights reserved.