如何重新定义Scala类型标签的操作

问题描述 投票:1回答:1

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

import shapeless.tag.@@
import shapeless.tag

trait VolumeTag
type Volume = Double @@ VolumeTag

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

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

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

无需铸造就可以实现吗?

scala types operator-overloading shapeless
1个回答
2
投票

您可以定义扩展方法

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实际上是强制转换。

© www.soinside.com 2019 - 2024. All rights reserved.