意外的隐式转换

时间:2017-10-10 07:34:36

标签: scala implicit

在以下示例中:

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

1 个答案:

答案 0 :(得分:2)

原因是编译器优先考虑第二个隐式方法(fraction2Double),因为它不需要修改应用*方法的对象。

如果我们要移除fraction2Double方法并且仅离开int2Fraction,结果会有所不同:

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

来源:"Scala for the Impatient" by Cay S. Horstmann