2011-10-13 43 views
4

我讀斯卡拉在由Joshua D. Suereth深度,並在跨階約隱含的觀點下面的代碼來了:隱意見

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

我無法解釋爲什麼,但是bar(new Foo {})'確實可以工作,如果你在'Bar'而不是'Foo'的伴隨對象中定義了隱式轉換。 –

+0

有趣。這也編譯:'bar(new Foo {}:Foo)'。 –

回答

6

這裏有一些關於你在做什麼:

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

當你做這樣的事情bar(new Foo {}),編譯器不知道你在做什麼 - 它試圖找到bar方法,將接受new Foo {},但它不知道究竟是什麼類型new Foo {}是,是因爲它取決於bar是什麼。

如果聲明val f = new Foo{},f的類型變得固定,然後幫助編譯器找出它應該對bar做些什麼。

+0

但編譯器的確發現類型爲java.lang.Object with test.Foo'。 – markmarch

+2

@markmarch沒有及時進行隱式解析。 –