伴侣对象中的隐式视图

时间:2011-10-13 21:56:04

标签: scala implicit

我正在阅读Joshua D. Suereth的Scala In Depth,并且在scala中遇到了关于隐式视图的以下代码:

object test {
  trait Foo
  trait Bar
  object Foo {
    implicit def fooToBar(f : Foo) =  new Bar{ }
  }
}

然后定义一个需要Bar作为参数的方法:

def bar(x : Bar) = println("bar")

为什么以下有效:

val f = new Foo{}
bar(f) // print "bar"

但是

bar(new Foo{})

会导致编译器出现类型不匹配错误:

error: type mismatch;
found   : java.lang.Object with test.Foo
required: test.Bar
          bar(new Foo {})
              ^

1 个答案:

答案 0 :(得分:6)

以下是您正在做的事情:

new Foo {} // Anonymous subclass of Object with trait Foo
new Foo () // Foo
new Foo    // Foo

当您执行bar(new Foo {})之类的操作时,编译器还不知道您在做什么 - 它会尝试查找接受bar的{​​{1}}方法,但它不会我不确切知道new Foo {}的类型,因为它取决于new Foo {}是什么。

如果您声明bar,则val f = new Foo{}的类型将被修复,这有助于编译器找出它应该对f执行的操作。