2014-09-28 64 views
1

下面的代碼定義了一個列表類型和兩個實施案例類一個代表空列表和缺點,以創建實際列表Scala:伴侶中的「應用」方法需要創建案例類實例嗎?

sealed trait List[+A] 
case object Nil extends List[Nothing] 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

object List { 
    ... 
    def apply[A](as: A*): List[A] = { 
    if (as.isEmpty) Nil 
    else Cons(as.head, apply(as.tail: _*)) 
    } 
    val example = Cons(1, Cons(2, Cons(3, Nil))) 
} 

是我的假設是正確的,該列表由遞歸創建應用上面當val example = ...方法被執行。

如果是這樣。創建缺點簽名Cons(head, tail)其中作爲的應用簽名是不兼容的variaddef apply[A](as: A*): List[A],如何斯卡拉實際上推斷val exampleList(1, 2, 3, Nil)

回答

1

當你說

class Foo(s: String, i: Int) 

在Scala中,它會產生一個類Foo,構造函數採用StringInt

這幾乎是一樣的Java類聲明爲

public class Foo { 
    public Foo(String s, int i) { 
     ... 
    } 
} 

有了case類,編譯器提供了額外的好東西,如用默認apply方法走的是相同的參數構造一個同伴對象。

因此,這就是爲什麼您可以直接調用Cons(head, tail),而無需明確定義構造函數。

+0

'val example2 = List(1,2,3)',實際上我想了解Cons實例是如何創建的,因爲沒有構造函數,我說把頭部和尾部放在一起來創建Cons [Int],scala如何實現這一點。 – 2014-09-28 15:09:22

+0

我不確定我是否理解這個問題。 'Const'是一個case類,因此它有一個構造函數,帶有'A'和'List [A]'。你明確地在'apply'方法的else分支中調用它。 – 2014-09-28 15:17:52

+0

如果你可以原諒我的新手,我會盡力解釋。正如你所提到的,由於Cons沒有正文,它有一個空構造函數。應用調用Cons以遞歸方式創建它的實例。但是apply和Cons構造函數的參數是不同的。 – 2014-09-28 15:23:50