2014-09-28 108 views
7
> val a:Seq[Integer] = Seq(3,4) 
a: Seq[Integer] = List(3, 4) 

如果Seq只是一個特徵,爲什麼編譯器/ REPL接受它,並且它的行爲與其他許多特徵甚至抽象類一樣?爲什麼scala將Seq轉換爲List?

+0

到目前爲止提供的答案沒有回答它的基本原理的部分,以及這是否圍繞大部分scala集合庫。如果有一個好的,我會很樂意從中學習! – matanster 2014-09-28 14:09:05

+0

增加了一些理由;) – soulcheck 2014-09-28 14:10:14

+0

好的。 [評論最小長度填充] – matanster 2014-09-28 14:11:11

回答

8

它不會轉換任何東西。

Seq是一個特質,你不能真正實例化它,只能將它混合到某個類中。

由於Seq同伴對象的apply方法必須返回一些具體的類實例(在Seq特點是混合),它返回一個List這似乎是一個合理的默認值。

一種情況這可能是有用的是,當你需要一些Seq實例,但不關心執行和沒有時間看的類型結構,找到一個合適的類實現SeqSeq(3,4)保證給你一些服從Seq合同。

+0

我想了解更多。它在哪裏定義了默認實現?我沒有在[Scaladoc](http://www.scala-lang.org/api/current/index.html#scala.collection.Seq)中看到,伴隨對象聲稱它有默認的 – matanster 2014-09-28 13:59:28

+0

@matt,請參閱編輯,我覺得現在更清楚了。 – soulcheck 2014-09-28 14:01:48

+0

@matt你會用什麼'Seq'的其他實現? – soulcheck 2014-09-28 14:04:55

6

Seq默認的實現是一個List作爲scaladoc這裏提到:

Seq Object

它說

此對象提供的一組操作來創建SEQ值。 Seq的當前默認實現是List。

當調用Seq(3,4)你實際調用Seq.apply(3,4)它建立兩個元素作爲List下面的序列。