为什么scala将Seq转换为List?

mat*_*ter 8 scala

> val a:Seq[Integer] = Seq(3,4)
a: Seq[Integer] = List(3, 4)
Run Code Online (Sandbox Code Playgroud)

如果Seq只是一个特征,为什么编译器/ REPL接受它,并且它的行为与许多其他特征甚至抽象类的行为相同?

sou*_*eck 8

它没有转换任何东西.

Seq 是一个特质,你无法真正实例化它,只能将它混合到一些类中.

由于伴随对象的apply方法Seq必须返回一些具体的类实例(混合在Seq特征中),它返回一个List似乎是合理的默认值.

这可能有用的一种情况是,当您需要某个Seq实例时,但不关心实现,也没有时间查看类型层次结构以找到合适的类实现Seq.Seq(3,4)保证给你一些服从Seq合同的东西.

  • @acjay是的,这将是另一个不错的选择,虽然List可能更轻量级(默认为链表)并且在函数式编程中很流行.`Vector`是`IndexedSeq`的默认实现. (2认同)

tux*_*dna 6

默认实现Seq是scaladoc中提到的List:

Seq对象

哪个说

此对象提供一组用于创建Seq值的操作.Seq的当前默认实现是List.

在调用时,Seq(3,4)您实际调用Seq.apply(3,4)构建两个元素的序列作为List底层.