试图理解隐含发现的这种情况 - 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 进行实验,这又导致了编译错误。
你能解释一下我做错了什么部分吗?
答案 0 :(得分:3)
def +(other: A) =...
和def mul(other: A) =...
之间的区别在于Int
有一个+
方法,但它没有mul
方法。
如果方法存在,但不存在传递的参数类型,则编译器将查找隐式转换。隐式作用域中包含传递的参数参数的伴随对象。如果找到隐式转换,则评估整个表达式的转换。
如果该方法不存在,则伴随对象中的隐式转换不在隐式范围内。它找不到,也没有转换。
如果您要将implicit def fromInt(...
移到配套对象之外,则会进行mul()
转换。