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