使用 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")
隐式 def javaBigDecimal2bigDecimal(x: java.math.BigDecimal): BigDecimal = BigDecimal(x)
新的 java.math.BigDecimal("1") + BigDecimal(1)
为什么这样?
最佳答案
在第一个表达式中 BigDecimal(1) + new java.math.BigDecimal("1")
作品规则:
Compiler will look for implicits defined within any object of the implicit scope of the type it's looking for.
所以,有一个方法
+(BigDecimal): BigDecimal
在 scala.math.BigDecimal
.编译器看到错误的参数类型( java.math.BigDecimal
)并开始寻找到类型 BigDecimal
的转换.作用域内找不到,然后在BigDecimal
中查找对象并找到 javaBigDecimal2bigDecimal
.如果存在
javaBigDecimal2bigDecimal
,则第二个示例将起作用范围内的转换,因为 java.math.BigDecimal
没有 +
方法,编译器会寻找到正确类型的转换(有方法 +(BigDecimal)
)
关于scala - 为什么 javaBigDecimal2bigDecimal 隐式不适用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448781/