4

scala 2.9.2 では、このコード:

BigDecimal(1) + 新しい java.math.BigDecimal("1")
new java.math.BigDecimal("1") + BigDecimal(1)

2 番目のケースでは scala.math.BigDecimal$#javaBigDecimal2bigDecimal が適用されないため、コンパイルされません。

ただし、その前に同じ暗黙的な権利を定義すると、コードはコンパイルされます。

BigDecimal(1) + 新しい java.math.BigDecimal("1")
暗黙の定義 javaBigDecimal2bigDecimal(x: java.math.BigDecimal): BigDecimal = BigDecimal(x)
new java.math.BigDecimal("1") + BigDecimal(1)

なんでそうなの?

4

2 に答える 2

5

最初の式BigDecimal(1) + new java.math.BigDecimal("1")の動作規則:

コンパイラは、探している型の暗黙的なスコープの任意のオブジェクト内で定義された暗黙的なものを探します。

ということで、方法+(BigDecimal): BigDecimalがありscala.math.BigDecimalます。コンパイラは間違った引数の型 ( java.math.BigDecimal) を認識し、型への変換を探し始めますBigDecimal。スコープ内に 1 つが見つからないため、BigDecimalobject を調べて を見つけjavaBigDecimal2bigDecimalます。

2 番目の例は、メソッドがないjavaBigDecimal2bigDecimalためにスコープ内に変換がある場合に機能し、コンパイラは適切な型 ( method を持つ)への変換を探します。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 に答える