2017-10-10 160 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