为什么只有在显式声明时才会进行隐式转换?
implicit class Foo(b: Bar) {
def foo = 1
}
class Bag extends Bar {
val bag = foo // does not work
val bag = this.foo // does work
}
人
当您说val bag = foo
时,编译器将在名为foo
的范围内查找值。如果找不到,它将抛出一个错误。
为了触发隐式,你需要尝试调用一个没有该方法的on对象的方法foo
。在这种情况下,this
就是那个对象。只有这样,编译器才会隐式地将this
转换为Foo
,以便调用foo
。
编译器不会自动尝试将foo
扩展为this.foo
。如果foo
不应该是类成员呢?如果它是一个局部变量呢?它怎么可能知道我们的意图?
想象它展开了,这应该能回答你的问题:
val bag = new Foo(this).foo
如果你只是调用foo
,编译器不会跳转到this
前面来启动隐式搜索。您需要提供应该使用this
并随后包装的提示。