1

例如,我有两种标记类型:

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

有什么方法可以修改标记类型而无需重新标记新的修改值?

4

1 回答 1

0

怕不是。我认为你能做到的最好的办法就是尽量减少你的痛苦。我会使用带有类似方法的隐式类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)
于 2021-02-25T23:10:22.470 回答