2012-07-09 30 views
1

不同的表現只是想知道如果下面是一個錯誤或功能:隱丘壑與類型註釋

Welcome to Scala version 2.10.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class TypeClass[T] 
defined class TypeClass 

scala> trait A[T] { 
    | implicit val t = implicitly[TypeClass[T]] 
    | } 
<console>:9: error: could not find implicit value for parameter e: TypeClass[T] 
     implicit val t = implicitly[TypeClass[T]] 
            ^

正如預期的那樣,這並不編譯,因爲有上T沒有限制。但是當我添加一個類型註釋它編譯:

scala> trait A[T] { 
    | implicit val t: TypeClass[T] = implicitly[TypeClass[T]] 
    | } 
defined trait A 

不應該編譯器在這裏抱怨?爲什麼類型註釋會有所作爲?如果我們用這個特徵實例化一些東西,tnull

回答

5

實際上,你只是在這裏找到自己。 :-)

您剛纔宣稱隱含的TypeClass[T]val t。也就是,val t = t,這使它爲空。哎喲!

T是抽象的,所以編譯器不能爲它提供一個TypeClass。你必須得到T參數,但你將無法在trait。在class中,使其爲T : TypeClass

2

我會說這既不是bug也不是功能,只是某些功能的結果。

在第一個示例中,範圍內不存在TypeClass[T]類型的隱式值。您依靠類型推斷來知道t的類型,並且由於在編譯時解決了隱含問題,因此未定義t的類型,因爲無法找到隱式值。

在第二個示例中,範圍內有一個合適的隱式值,即t。如果你一般不允許這種行爲,你不能做遞歸定義,如:

val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (x,y) => x+y}