4

使用 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)

为什么这样?

4

2 回答 2

5

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

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

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

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

于 2012-05-04T14:38:50.143 回答
3

你有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
于 2012-05-04T14:15:54.117 回答