Scala隐式参数的类型查找失败

时间:2017-10-04 19:03:58

标签: scala implicit-conversion implicit

试图理解隐含发现的这种情况 - finding implicit of an argument's type。我将官方示例复制粘贴到IDE中,然后将方法名称更改为 mul ,如下所示:

class A(val n: Int) {
  def mul(other: A) = new A(n + other.n)
}
object A {
  implicit def fromInt(n: Int) = new A(n)
}
1 mul (new A(1))

现在它导致编译错误说:

value mul is not a member of Int

我还尝试使用字符串而不是 Int 进行实验,这又导致了编译错误。

你能解释一下我做错了什么部分吗?

1 个答案:

答案 0 :(得分:3)

def +(other: A) =...def mul(other: A) =...之间的区别在于Int有一个+方法,但它没有mul方法。

如果方法存在,但不存在传递的参数类型,则编译器将查找隐式转换。隐式作用域中包含传递的参数参数的伴随对象。如果找到隐式转换,则评估整个表达式的转换。

如果该方法不存在,则伴随对象中的隐式转换不在隐式范围内。它找不到,也没有转换。

如果您要将implicit def fromInt(...移到配套对象之外,则会进行mul()转换。