我正在阅读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)
这是关于你在做什么的事情:
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.
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |