2014-09-28 99 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下面的序列。

相关问题