你是對的; new
不是強制性的。他們可以定義的實例方法List#::
這樣也很好:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(需要注意的是,我們有:
type :: = collection.immutable.::
val :: = collection.immutable.::
在scala
包對象定義;第一個是爲什麼你new scala.::(x, this)
作品,第二個是爲什麼我的scala.::(x, this)
工作。)
The form the library uses直接調用構造函數,像你的那樣。替代方法調用爲::
案例類生成的合成伴隨對象的apply
方法,該方法只是簡單地調用構造函數。也許調用構造函數被認爲更清晰或更高效? (效率的提高應該是幾乎爲零,不過,因爲如果編譯器不內聯調用apply
,JVM將),我想最緊湊的形式:
def ::[U >: T](x: U) = ::(x, this)
可能被誤認爲是一些古怪(即不可能)遞歸調用,並且無論如何都模糊了名爲::
和List
方法::
的方法之間的區別,Odersky教授爲了最大限度地提高讀者理解力而努力保持分離。
希望這會有所幫助。
final只表示該類不能被擴展,它與實例創建無關:-)。案例類基本上是一個可以在「匹配案例」塊中進行比較的類。 – aishwarya 2011-12-15 02:32:48