scala - 为什么 javaBigDecimal2bigDecimal 隐式不适用?

标签 scala implicit-conversion

使用 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): BigDecimalscala.math.BigDecimal .编译器看到错误的参数类型( java.math.BigDecimal )并开始寻找到类型 BigDecimal 的转换.作用域内找不到,然后在BigDecimal中查找对象并找到 javaBigDecimal2bigDecimal .

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

关于scala - 为什么 javaBigDecimal2bigDecimal 隐式不适用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448781/

相关文章:

arrays - 这是一个C代码,可使用函数在50个元素的数组中查找平均值

c++ - 隐式转换 : const reference vs non-const reference vs non-reference

scala - Scala 2.12 中的协变和更高种类的类型

json - play2-reactivemongo 从 0.18.4 版升级到 0.19.5 版后的警告

java - Java 中的编译器即服务

c++ - 运算符 double() 的使用不清楚

c# - Null-Coalescing 运算符结果的隐式转换

c++ - 为什么 char 既没有符号也没有符号,而 wchar_t 是?

scala - 在不使用惰性 val 的情况下在特征初始化中避免 NPE

scala - 有什么方法可以使用反射在运行时访问 Scala 选项声明的类型吗?