繁体   English   中英

无形。 修改标记类型

[英]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)才能编译此代码。 它有效,但是,恕我直言,它看起来有点丑陋。

TimestampCreated标记,新的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM