迷失在Scala集合的继承图中

fre*_*low 10 collections complexity-theory inheritance types scala

今天我想了解以下的超类型List:

sealed abstract class List[+A] extends AbstractSeq[A]
                                  with LinearSeq[A]
                                  with Product
                                  with GenericTraversableTemplate[A, List]
                                  with LinearSeqOptimized[A, List[A]]
Run Code Online (Sandbox Code Playgroud)

哇,所以List已经有五个直接超类型了.我们随机选一个:

trait LinearSeq[+A] extends Seq[A]
                       with scala.collection.LinearSeq[A]
                       with GenericTraversableTemplate[A, LinearSeq]
                       with LinearSeqLike[A, LinearSeq[A]]
Run Code Online (Sandbox Code Playgroud)

好的,让我们选择名称最相似的那个:

trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]] extends SeqLike[A, Repr]
Run Code Online (Sandbox Code Playgroud)

啊,似乎我们到了某个地方,只留下了一个超类型:

trait SeqLike[+A, +Repr] extends Any
                            with IterableLike[A, Repr]
                            with GenSeqLike[A, Repr]
                            with Parallelizable[A, ParSeq[A]]
Run Code Online (Sandbox Code Playgroud)

此时我放弃了.这张图有多深?所有这些超类型中哪一个在概念上是相关的,哪些只是实现细节或优化技巧?

如何理解如此巨大的遗传图?

par*_*tic 6

大多数父母确实是实施细节和优化技巧.如果你不关心它,你可以忽略任何东西Like或者Template最后.将其应用于列表,我们有:List <: LinearSeq <: Seq <: Iterable <: Traversable.您应该在代码中使用这些特征作为参数类型(而不是实现特征).它们描述于:Scala Collections API

如果您想了解如何使用实现特征,或者设计自己的集合,您应该阅读本教程:Scala集合的体系结构.

此外,如果您想/需要知道实际实现给定方法的位置,请单击scaladoc中的方法签名以展开de description." 定义类"字段显示指向实施位置的链接.