Scala 2.9中定义的数字和双精度之间的隐式转换在哪里

Scala 2.9中定义的数字和双精度之间的隐式转换在哪里,scala,numeric,implicit-conversion,Scala,Numeric,Implicit Conversion,我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。把它归结为一个非常简单的例子,这段代码没有编译,原因似乎是我没有导入Double和Numeric[Double]之间的隐式转换: import scala.math.Numeric import scala.math.Numeric._ import scala.math.Numeric.Implicits._ import Ordering.Implicits._ object Impl

我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。把它归结为一个非常简单的例子,这段代码没有编译,原因似乎是我没有导入Double和Numeric[Double]之间的隐式转换:

import scala.math.Numeric
import scala.math.Numeric._
import scala.math.Numeric.Implicits._
import Ordering.Implicits._

object ImplicitNumericConversions {
  val v: Numeric[Double] = 3.0
}
我可以通过提供自己的功能轻松解决此问题:

import scala.math.Numeric

object ImplicitNumericConversions {
  def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num

  val v: Numeric[Double] = convertDoubleToNumeric(3.0)
}
如果我使转换函数隐式,那么我得到了我想要的:

import scala.math.Numeric

object ImplicitNumericConversions {

  implicit def convertDoubleToNumeric(d: Double)(implicit num: Numeric[Double]): Numeric[Double] = num

  val v: Numeric[Double] = 3.0
}
。。。但是为什么scala.math.Numeric的导入不为我做这个呢

我正在处理的实际问题如下所示:

class NumericRange[T <% Numeric[T]](val lower: T, val upper: T) { ... }

object NumericRange {

  def apply[T](lower: T, upper: T)(implicit num: Numeric[T]) = {
    import num._
    new NumericRange[T](lower, upper)
  }
}
Numeric
是一个,这意味着您不会以这种方式处理
Numeric[Double]
的实例,而是在指定如何对
Double
执行数字操作的范围内有一个隐式
Numeric[Double]
(有关
排序的相关讨论,请参阅)

因此,您要查找的是隐式的
Numeric[T]
,而不是
T=>Numeric[T]
。幸运的是,你可以写:

class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }
或:


第一个中的“上下文绑定”只是第二个中隐式参数的语法糖。

解决了NumericRange的问题。我尝试将同样的技术应用到OrderedRange实现中。使用(隐式ev:Ordering[T])也以同样的方式工作。我无法(隐式ev:Ordered[t])查看比较运算符,因此在这个问题上还有另一个难题需要解决,但我将把它留给另一个问题。惊人的回答-谢谢你。
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }
class NumericRange[T](val lower: T, val upper: T)(implicit
  ev: Numeric[T]
) { ... }