scala - 如何重新定义 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]
。
是否有可能在不铸造的情况下实现这一目标?
解决方案
您可以定义扩展方法
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
实际上是铸造。
推荐阅读
- c++ - 如何通过指针访问数组的元素?
- prolog - 使用 clpfd 的问题空间很小,超出了 SWI-Prolog 堆栈限制
- scala - 更简洁地从 spark 数据框中选择多列
- typescript - strictNullChecks 导致错误:泛型类型不存在 hasOwnProperty
- mongodb - 动态访问MongoDB字段
- android - Android:在我的应用程序中实现 Trusted Place API
- angular - 如何从 Angular2 中的 XHR 标头获取日期?
- laravel - 无法使用vue axios在数据表中显示数据
- android - 如何将用户重定向到定义的 Play 商店实验变体?
- java - 向警报对话框添加圆角