2017-10-10 14 views
1

予期しない暗黙的な変換

import scala.language.implicitConversions 

class Fraction(val num: Int, val den: Int) { 
    def *(other: Fraction) = new Fraction(num * other.num, den * other.den) 
} 

implicit def int2Fraction(n: Int) = new Fraction(n, 1) 
implicit def fraction2Double(f: Fraction) = f.num * 1.0/f.den 

なぜ結果がDoubleないFractionのですか?つまり、fraction2Doubleメソッドがここに適用され、int2Fractionでないのはなぜですか?

scala> 4 * new Fraction(1, 2) 
res0: Double = 2.0 

答えて

2

理由は、*方法が適用されるオブジェクトの変更を必要としないため、第二陰解法(fraction2Double)は、コンパイラによって優先されるということです。我々はfraction2Doubleメソッドを削除し、のみint2Fractionを残していた場合は

、結果が異なることになります。

scala> 4 * new Fraction(1, 2) 
res0: Fraction = 4/2 

出典:"Scala for the Impatient" by Cay S. Horstmann

関連する問題