2012-05-04 11 views
4

暗黙的にjavaBigDecimal2bigDecimalが適用されないのはなぜですか? 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) 

なぜそうですか?

答えて

5

BigDecimal(1) + new java.math.BigDecimal("1")働くルール:

コンパイラ探しているタイプの暗黙的なスコープのオブジェクト内に定義された暗黙を探します。

したがって、scala.math.BigDecimalには+(BigDecimal): BigDecimalというメソッドがあります。コンパイラは間違った引数型(java.math.BigDecimal)を認識し、BigDecimalへの変換を探し始めます。範囲内にあるものを見つけることができず、次にBigDecimalオブジェクトを探し、javaBigDecimal2bigDecimalを見つけます。 +方法を持っていないjava.math.BigDecimalので、範囲内javaBigDecimal2bigDecimal変換がある場合

第二の例では動作しますが、コンパイラは

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 
+0

はありません、私は追加しませんでした(+(BigDecimal)メソッドを持っている)適切な型への変換を探します最初のケースでなぜ暗黙のままであるのか不思議に思っていた – OlegYch

+0

最初のケースではコンパイラが知っているので、 'BigDecimal'が期待されているので、指定された型から' BigDecimal ' – drexin

関連する問題