在以下示例中:
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
答案 0 :(得分:2)
原因是编译器优先考虑第二个隐式方法(fraction2Double
),因为它不需要修改应用*
方法的对象。
如果我们要移除fraction2Double
方法并且仅离开int2Fraction
,结果会有所不同:
scala> 4 * new Fraction(1, 2)
res0: Fraction = 4/2