scala - 无形。修改标记类型
问题描述
例如,我有两种标记类型:
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
需要LocalDateTime
由 标记Created
。
所以我必须改变我的转换来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)