我正在阅读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 {})
^
答案 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
执行的操作。