2017-10-04 203 views
2

试图了解这种隐式发现的情况 - 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,这又导致编译错误。

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

回答

3

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

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

如果该方法不存在,则伴随对象中的隐式转换不在隐式范围内。它不会被发现,也不会发生转换。

如果您要将implicit def fromInt(...移动到伴随对象的外部,那么将发生mul()转换。

+0

哇,非常感谢!这正是问题所在。应用隐式之前,方法名称应该已存在于对象上。 –

+1

非常有趣,当这种分辨率会有用吗? – Mikel

+1

@Mikel;这是个好问题。我不知道为什么/隐含的范围规则是为什么决定的。对于了解这一点我有点惊讶。 – jwvh