首页 > 解决方案 > 如何重新定义 Scala 类型标签的操作

问题描述

假设我有一个标记类型,例如:

import shapeless.tag.@@
import shapeless.tag

trait VolumeTag
type Volume = Double @@ VolumeTag

def Volume(value: Double): Volume = tag[Volume][Double](value)

现在,我遇到的问题是,例如,当我添加两个 type 对象时Volume,我得到了一个 double。如何重新定义+运算符,以便两个卷的返回值是一个卷?

我尝试添加一个新特征,例如。VolumeOperations重新定义+类型的对象Volume。但是我无法在+不使用的情况下实现.isInstanceOf[Volume]

是否有可能在不铸造的情况下实现这一目标?

标签: scalatypesoperator-overloadingshapeless

解决方案


您可以定义扩展方法

def Volume(value: Double): Volume = tag[VolumeTag][Double](value)

implicit class VolumeOp(v: Volume) {
  //def +(v1: Volume): Volume = Volume(v + v1)
  def plus(v1: Volume): Volume = Volume(v + v1)
}

tag实际上是铸造。


推荐阅读