隐式转换还没有开始



为什么只有在显式声明时才会进行隐式转换?

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并随后包装的提示。

最新更新