【问题标题】:Scala: Implicit evidence that BigDecimal is NumericScala:BigDecimal 是 Numeric 的隐含证据
【发布时间】:2017-05-01 09:32:34
【问题描述】:

scala.math.BigDecimal如何隐式转换为scala.math.Numeric

例如:对于Int的隐式转换链被追踪为:IntRichInt(转换在Predef中定义)和方法

protected implicit def num: Numeric[T]

来自父类scala.runtime.ScalaNumberProxy

scala.math.BigDecimal 的棘手之处在于它没有任何包装器。

提前致谢。

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

    Numeric[T] 是一个类型类,因此它不会将BigDecimal 转换为Numeric;相反,定义了一个隐含的Numeric[BigDecimal],其中包含Numeric 的实现,它对BigDecimal 值进行操作。

    这里定义了隐式 - https://github.com/scala/scala/blob/2.12.x/src/library/scala/math/Numeric.scala#L187

    【讨论】:

    • 这种隐含在Predef 中的表现如何?我不需要从scala.math 导入任何东西,这个隐式就可以工作。请详细说明。
    • 好问题。隐式实例存在于 Numeric 的伴随对象中,这是 scala 查找隐式值的地方之一。它将检查同伴的隐式类型(Numeric)及其类型参数(BigDecimal)以及当前范围。您需要阅读 scala 在哪里寻找隐式以更好地理解这一点 - stackoverflow.com/questions/5598085/…
    • 因此,在定义自己的隐式(或者更好的是,类型类实例)时,请尝试将它们保留在关联的伴随对象中。
    • 非常感谢,现在完全有道理了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2014-03-16
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多