[英]Shapeless. Modify tagged type
例如,我有两种标记类型:
trait Created
type CreatedDttm = LocalDateTime @@ Created
type CreatedTs = Timestamp @@ Created
该类型用于处理模型。 第一个用于通用模型,第二个用于db
实体。
final case class Entity(created: CreatedDttm) // Common model
final case class EntityRow(created: CreatedTs) // DB model
我的资料中有一个转换器:
def toModel(e: EntityRow) = Entity(e.created.toLocalDateTime) // Does not compile
此转换无法编译,导致e.created.toLocalDateTime
返回LocalDateTime
,但Entity
需要由Created
标记的LocalDateTime
。
因此,我必须将转换更改为tag[Created](e.created.toLocalDateTime)
才能编译此代码。 它有效,但是,恕我直言,它看起来有点丑陋。
Timestamp
由Created
标记,新的LocalDateTime
也必须由相同的Created
标记。
有没有办法修改标记类型而无需重新标记新的修改值?
怕不是。 我认为你能做到的最好的办法是尽量减少你的痛苦。 我会使用一个隐式类和类似toCreatedDttm
的方法。 像这样的东西:
implicit class LocalDateTimeOps(value: LocalDateTime) {
def toCreatedDttm: CreatedDttm = tag[Created][LocalDateTime](value)
}
然后您可以将您的线路更改为:
def toModel(e: EntityRow) = Entity(e.created.toLocalDateTime.toCreatedDttm)
或者,您可以让隐式类直接对Timestamp
进行操作,如下所示:
implicit class TimestampOps(value: Timestamp) {
def toCreatedDttm: CreatedDttm = tag[Created][LocalDateTime](value.toLocalDateTime)
}
那么这条线可能是:
def toModel(e: EntityRow) = Entity(e.created.toCreatedDttm)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.