为什么javaBigDecimal2bigDecimal隐含不适用?

时间:2012-05-04 12:27:11

标签: scala implicit-conversion

使用scala 2.9.2此代码:

BigDecimal(1) + new java.math.BigDecimal("1")
new java.math.BigDecimal("1") + BigDecimal(1)

无法编译,因为在第二种情况下未应用scala.math.BigDecimal $#javaBigDecimal2bigDecimal

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

BigDecimal(1) + new java.math.BigDecimal("1")
implicit def javaBigDecimal2bigDecimal(x: java.math.BigDecimal): BigDecimal = BigDecimal(x)
new java.math.BigDecimal("1") + BigDecimal(1)

为什么会这样?

2 个答案:

答案 0 :(得分:5)

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

  

编译器将查找在其正在查找的类型的隐式作用域的任何对象中定义的implicits。

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

如果范围内有javaBigDecimal2bigDecimal转换,则第二个示例将起作用,因为java.math.BigDecimal没有+方法,编译器会查找转换为正确的类型(具有方法{{ 1}})

答案 1 :(得分: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