【问题标题】:Why javaBigDecimal2bigDecimal implicit is not applicable?为什么 javaBigDecimal2bigDecimal 隐式不适用?
【发布时间】:2012-05-05 02:21:09
【问题描述】:

使用 scala 2.9.2 此代码:

BigDecimal(1) + 新 java.math.BigDecimal("1") 新的 java.math.BigDecimal("1") + BigDecimal(1)

无法编译,因为 scala.math.BigDecimal$#javaBigDecimal2bigDecimal 不适用于第二种情况

但是,如果我在它之前定义相同的隐式,代码编译:

BigDecimal(1) + 新 java.math.BigDecimal("1") 隐式定义 javaBigDecimal2bigDecimal(x: java.math.BigDecimal): BigDecimal = BigDecimal(x) 新的 java.math.BigDecimal("1") + BigDecimal(1)

为什么会这样?

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    在第一个表达式BigDecimal(1) + new java.math.BigDecimal("1") 工作规则:

    编译器将查找在它正在查找的类型的隐式范围内的任何对象中定义的隐式。

    所以,scala.math.BigDecimal 上有一个方法 +(BigDecimal): BigDecimal。编译器看到错误的参数类型 (java.math.BigDecimal) 并开始寻找转换为类型 BigDecimal。它在范围内找不到,然后在BigDecimal对象中查找并找到javaBigDecimal2bigDecimal

    如果在范围内有javaBigDecimal2bigDecimal 转换,第二个示例将起作用,因为java.math.BigDecimal 没有+ 方法,编译器将寻找转换为正确类型(有方法+(BigDecimal)

    【讨论】:

      【解决方案2】:

      import math.BigDecimal._ 了吗?对我来说它工作得很好:

      Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04).
      Type in expressions to have them evaluated.
      Type :help for more information.
      
      scala> import math.BigDecimal._
      import math.BigDecimal._
      
      scala> import math.BigDecimal
      import math.BigDecimal
      
      scala> BigDecimal(1) + new java.math.BigDecimal(1)
      res0: scala.math.BigDecimal = 2
      

      编辑:

      忘了提,这也有效:

      scala> new java.math.BigDecimal("1") + BigDecimal(1)
      res0: scala.math.BigDecimal = 2
      

      【讨论】:

      • 不,我没有添加导入,但我想知道为什么在第一种情况下隐式仍然适用
      • 因为在第一种情况下,编译器知道 BigDecimal 是预期的,因此在 BigDecimal 伴侣中查找从给定类型到 BigDecimal 的隐式转换
      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2021-03-31
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多