我一直在编写一些scala代码,这些代码编译得很好,但不知何故,我破坏了隐式转换,我无法找出我做错了什么。简而言之,这段代码不能编译,原因似乎是我没有导入Double和NumericDouble之间的隐式转换
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)
}
}..。在编译创建新NumericRange的代码行时,不会显示以下错误:
Multiple markers at this line
- No implicit view available from T => scala.math.Numeric[T].
- not enough arguments for constructor NumericRange: (implicit evidence$1: T => scala.math.Numeric[T])org.reductio.rtree.NumericRange[T]. Unspecified value parameter
evidence$1.
- not enough arguments for constructor NumericRange: (implicit evidence$1: T => scala.math.Numeric[T])org.reductio.rtree.NumericRange[T]. Unspecified value parameter
evidence$1.
- No implicit view available from T => scala.math.Numeric[T].发布于 2012-12-02 23:55:17
Numeric是一个type class,这意味着您不能以这种方式使用Numeric[Double]的实例,而是在作用域中有一个隐式的Numeric[Double],它指定如何在Double上执行数值操作(有关Ordering的相关讨论,请参阅my answer here )。
因此,您要查找的是隐式Numeric[T],而不是T => Numeric[T]。幸运的是,这里有one of those in scope for Double,所以你可以这样写:
class NumericRange[T: Numeric](val lower: T, val upper: T) { ... }或者:
class NumericRange[T](val lower: T, val upper: T)(implicit
ev: Numeric[T]
) { ... }第一个中的“上下文界限”只是第二个中隐含参数的句法糖。
https://stackoverflow.com/questions/13670636
复制相似问题