【发布时间】:2017-08-04 08:41:14
【问题描述】:
我正在尝试将数值运算添加到我定义的名为Quantity 的值类中。我正在使用的代码如下...
import scala.language.implicitConversions
case class Quantity(value: Double) extends AnyVal
object Quantity {
implicit def mkNumericOps(lhs: Quantity): QuantityIsNumeric.Ops = QuantityIsNumeric.mkNumericOps(lhs)
}
object QuantityIsNumeric extends Numeric[Quantity] {
def plus(x: Quantity, y: Quantity): Quantity = Quantity(x.value + y.value)
def minus(x: Quantity, y: Quantity): Quantity = Quantity(x.value - y.value)
def times(x: Quantity, y: Quantity): Quantity = Quantity(x.value * y.value)
def negate(x: Quantity): Quantity = Quantity(-x.value)
def fromInt(x: Int): Quantity = Quantity(x.toDouble)
def toInt(x: Quantity): Int = x.value.toInt
def toLong(x: Quantity): Long = x.value.toLong
def toFloat(x: Quantity): Float = x.value.toFloat
def toDouble(x: Quantity): Double = x.value
def compare(x: Quantity, y: Quantity): Int = x.value compare y.value
}
我使用这段代码如下...
class SortedAskOrders[T <: Tradable] private(orders: immutable.TreeSet[LimitAskOrder[T]], val numberUnits: Quantity) {
def + (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders + order, numberUnits + order.quantity)
}
def - (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders - order, numberUnits - order.quantity)
}
def head: LimitAskOrder[T] = orders.head
def tail: SortedAskOrders[T] = new SortedAskOrders(orders.tail, numberUnits - head.quantity)
}
...当我尝试编译此代码时,我收到以下错误..
Error:(29, 63) type mismatch;
found : org.economicsl.auctions.Quantity
required: String
new SortedAskOrders(orders + order, numberUnits + order.quantity)
+ 方法的以下实现显式使用隐式转换(我认为应该已经在范围内!)有效。
def + (order: LimitAskOrder[T]): SortedAskOrders[T] = {
new SortedAskOrders(orders + order, Quantity.mkNumericOps(numberUnits) + order.quantity)
}
编译器似乎无法找到数字 + 运算符的隐式转换。想法?
我认为使用隐式转换和Numeric trait 来为值类创建数值运算是非常标准的。我做错了什么?
【问题讨论】:
-
看起来您需要在文件顶部添加
import Quantity._ -
@YuriyGatilin 但是即使没有 import 语句,编译器也能够找到减法运算符的隐式转换。这让我觉得发生了其他事情......
-
这不是隐含在/超出范围的问题。其他操作(
-、*等)似乎可以毫无怨言地编译。不,很明显编译器并没有寻找隐式,因为+是字符串 concat op,并且由于所有内容都有字符串表示,因此它不需要隐式。我知道至少有一种解决方法,但我希望对此有更深入了解的人会以一种干净简单的方法来关闭字符串连接。
标签: scala implicit-conversion implicit value-class