这个简化(有点做作)的例子非常接近我正在寻找的。
implicit class PlusMinus(a: Double) {
def +-(b: Double) = if (a > b) a-b else a+b
}
有了这个,我可以:
scala> 3 +- 4L
res0: Double = 7.0
scala> 5f +- 1
res1: Double = 4.0
scala> 7L +- 6f
res3: Double = 1.0
但我不得不怀疑:
每个结果都是双精度。 我可以模仿标准库中的自动数字转换吗?
Int +- Int = Int Long +- Long = Long Long +- Float = Float // etc.
有没有更好的方法?(总有更好的方法。
你可以像这样实现你的运算符
implicit class PlusMinus[T](a: T)(implicit ev : Numeric[T]) {
def +-(b: T) = if (ev.gt(a, b)) ev.minus(a, b) else ev.plus(a , b)
}
这个快速解决方案有一个问题,只有在两个操作数中使用相同的类型才行。
这个似乎回应了你的问题:
implicit class PlusMinus[T](a: T)(implicit ev : Numeric[T]) {
def +-(b: Double) = {
val ad = ev.toDouble(a)
if (ad > b) ad - b else ad + b
}
def +-(b: Long) = {
val ad = ev.toLong(a)
if (ad > b) ad - b else ad + b
}
def +-(b: Int) = {
val ad = ev.toInt(a)
if (ad > b) ad - b else ad + b
}
def +-(b: Float) = {
val ad = ev.toFloat(a)
if (ad > b) ad - b else ad + b
}
}
我们有这个结果
3 +- 4 //> res0: Int = 7
3 +- 4L //> res1: Long = 7
3L +- 4 //> res2: Int = 7
您可以在最后一个中看到,结果类型是第二个操作数的类型。