2013-07-11 36 views
1

首先,這裏是代碼3個片段與其上的Scala 2.10.2理解類型轉換/錯誤Scala中在該示例

// 1. 
def one: Seq[List[String]] = 
    Seq(List("x")) ++ List(List("x")) 
println(one) 
// => List(List(x), List(x))) 

// 2. 
def two: List[List[String]] = 
    Seq(List("x")) ++ List(List("x")) 
println(two) 
// => 
// error: type mismatch; 
// found : Seq[List[String]] 
// required: List[List[String]] 
// Seq(List("x")) ++ List(List("x")) 
// one error found 

// 3. 
println(Seq(List("x")) ++ List(List("x"))) 
// => List(List(x), List(x)) 

的主要代碼在所有的3個片段輸出沿是相同的 - Seq(List("x")) ++ List(List("x"))

第一個和第三個代碼段顯示(打印)類型爲List[List[String]],但指定返回類型爲List[List[String]]的第二個代碼段無法編譯。第一個返回類型是Seq[List[String]],但它的輸出是List[List[String]]

究竟發生了什麼?

回答

3

第二個片段的返回類型爲List[List[String]],但值爲Seq[List[String]],這是發生異常的原因。清單是Seq的subclass,它是更具體的類型。 println打印出你的價值觀,而不是它們的類型,如果你想看到的實際類型的表達式,打印在斯卡拉REPL:

scala> Seq(List("x")) ++ List(List("x")) 
res5: Seq[List[String]] = List(List(x), List(x)) 

看到res5類型infered爲Seq[List[String]],但值List(List(x), List(x))。 List是一個自動覆蓋toString方法的case類,爲了可讀性,編譯器會覆蓋它。

0

第二片斷不編譯因爲Seq.++返回一個scala.collection.Seq(見ScalaDoc),其不是scala.collection.immutable.List

def ++[B](that: GenTraversableOnce[B]): Seq[B] 

this question也見。