2014-12-27 41 views
0

在下面的申請方法什麼是「爲:A *」?什麼是A *方法參數?

List(1, 2, 3) constucts類型的列表:Cons(1,Cons(2,Cons(3,Nil)))

從讀取的方法的代碼看起來它是一種語法糖用於相同類型的多個 類型參數?

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: _*)) 
     } 
    } 

如果這是真的should'nt這是同樣有效:

object List { 
    def apply[A](asHead: A , asTail : A): List[A] = 
     if (asHead.isEmpty) Nil 
     else { 
     Cons(asHead.head, apply(asTail.tail: _*)) 
     } 
+0

的可能重複[如何Scala可以在方法定義中接收多個參數?](http://stackoverflow.com/questions/1438762/how-can-scala-receive-multiple-parameters-in-a-method-definition) – 2014-12-27 13:47:53

+1

提示:Google for「斯卡拉明星「。 – 2014-12-27 13:48:08

回答

4

沒有,這裏有一個區別。

當您聲明asHead: A, asTail: A,asHeadasTail顯然具有相同的類型。然而,在使用as: A*的原始代碼中,as.head的類型是A,並且as.tail的類型是Seq[A]-可以從headtail的類型中推導出。因此,你的代碼不是一回事。

聲明A*代表「A型參數的可變數量」,通常稱爲變量。這是類似Seq[A],但在調用不同:

apply(1, 2, 3) // A* 
apply(Seq(1, 2, 3)) // Seq[A] 

對方到是: _*聲明,呼籲與序列的可變參數的方法時:

apply(Seq(1, 2, 3): _*) // A* 
apply(Seq(1, 2, 3)) // Seq[A] 
+0

那麼它會被翻譯成JVM可變參數(...在Java中)? – 2014-12-27 14:39:05

+0

@Daniel C. Sobral「聲明A *代表」類型A的可變數量的參數「,」這是否意味着類型A和類型Seq [A]是 是同一類型? – 2014-12-27 15:04:20

+0

@Daniel C. Sobral List是一個自定義的實現,更新後的問題 – 2014-12-27 15:30:42

相關問題