Scala:如何访问“Numeric”类型的算术运算?

Scala: how do I access a `Numeric` type's arithmetic operations?

class Foo[T](t: T)(implicit int: Numeric[T]) {
  val negated = -t
  val doubled = t + t
  val squared = t * t
  // ...
}

我在这里的所有三行上都有红色波浪线。给出了什么?

您需要为这些函数的隐式转换添加导入:

class Foo[T](t: T)(implicit num: Numeric[T]){
  import num._
  val negated = -t
  val doubled = t + t
  val squared = t * t
}

因为实际上它们是这样定义的(scala source code)

class Ops(lhs: T) {
  def +(rhs: T) = plus(lhs, rhs)
  def *(rhs: T) = times(lhs, rhs)
  // etc
}

您也可以放弃隐式转换并改为这样做:

class Foo[T](t: T)(implicit num: Numeric[T]){
  val negated = num.negate(t)
  val doubled = num.plus(t, t)
  val squared = num.times(t, t)
}

您有一些 TNumeric[T] 实例,这就是所有好东西所在的地方。所以你只需要访问你想要的方法(例如 plus):

class Foo[T](t: T)(implicit int: Numeric[T]) {

  val sum = int.plus(t, t)

}

如果您使用上下文绑定("T : Numeric" 语法糖),那么:

class Foo[T : Numeric](t: T) {

  val sum = implicitly[Numeric[T]].plus(t, t)

}

如果您想使用 + 等快捷运算符,只需导入隐式实例的成员即可:

class Foo[T](t: T)(implicit int: Numeric[T]) {

  import int._
  val sum = t + t

}