如何创建一个在Scala中对任何数字类型进行数学和比较的类?
一个明显的方法:
import math.Numeric.Implicits._
class Ops[T : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
让我知道......
Ops.scala:7: value > is not a member of type parameter T
嗯......我们可以用数字类型做数学,但我们无法比较它们?
所以我们也要说T
是Ordered[T]
...
class Ops[T <: Ordered[T] : Numeric] {
def add(a: T, b: T) = a + b
def gt(a: T, b: T) = a > b
}
编译。但是试着用呢?
new Ops[Int].gt(1, 2)
我得到......
Ops.scala:13: type arguments [Int] do not conform to class Ops's type parameter bounds [T <: Ordered[T]]
那么如何操作某些有序和数字的类型?
答案 0 :(得分:14)
scala> import Ordering.Implicits._
import Ordering.Implicits._
scala> import Numeric.Implicits._
import Numeric.Implicits._
scala> class Ops[T : Numeric] {
| def add(a: T, b: T) = a + b
| def gt(a: T, b: T) = a > b
| }
defined class Ops
scala> new Ops[Int].gt(12, 34)
res302: Boolean = false
答案 1 :(得分:4)
您必须导入mkNumericOps
和/或mkOrderingOps
:
val num = implicitly[Numeric[T]]
或
class Ops[T](implicit num: Numeric[T])
然后:
import num.{mkNumericOps,mkOrderingOps}
现在您可以与它们进行比较和计算。 也许这可以帮助你完成问题的第一部分。
顺便说一下:Ordered和Numeric就是这样的:
class Ops[T: Ordered: Numeric]