伴侣对象中的隐式视图

mar*_*rch 4 scala implicit

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

object test {
  trait Foo
  trait Bar
  object Foo {
    implicit def fooToBar(f : Foo) =  new Bar{ }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

def bar(x : Bar) = println("bar")
Run Code Online (Sandbox Code Playgroud)

为什么以下工作:

val f = new Foo{}
bar(f) // print "bar"
Run Code Online (Sandbox Code Playgroud)

bar(new Foo{})
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ral 6

这是关于你在做什么的事情:

new Foo {} // Anonymous subclass of Object with trait Foo
new Foo () // Foo
new Foo    // Foo
Run Code Online (Sandbox Code Playgroud)

当你做类似的事情时bar(new Foo {}),编译器还不知道你在做什么 - 它试图找到一个bar会接受的方法new Foo {},但它还不知道究竟是什么类型new Foo {},因为它取决于它是什么bar.

如果你声明val f = new Foo{},f's类型变得固定,这有助于编译器找出它应该做什么bar.

  • @markmarch没有及时进行隐式解决. (2认同)