迷失在Scala的继承图中';s系列

迷失在Scala的继承图中';s系列,scala,inheritance,collections,types,complexity-theory,Scala,Inheritance,Collections,Types,Complexity Theory,今天我想了解一下列表的超类型: sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A, List]

今天我想了解一下
列表的超类型:

sealed abstract class List[+A] extends AbstractSeq[A]
                                  with LinearSeq[A]
                                  with Product
                                  with GenericTraversableTemplate[A, List]
                                  with LinearSeqOptimized[A, List[A]]
哇,所以
List
已经有五个直接超类型了。让我们随机挑选一个:

trait LinearSeq[+A] extends Seq[A]
                       with scala.collection.LinearSeq[A]
                       with GenericTraversableTemplate[A, LinearSeq]
                       with LinearSeqLike[A, LinearSeq[A]]
好的,让我们选一个名字最相似的:

trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]] extends SeqLike[A, Repr]
在这一点上,我放弃了。这个图表有多深?所有这些超类型中哪些在概念上是相关的,哪些只是实现细节或优化技巧


如何理解如此巨大的继承图?

一旦你到达
SeqLike
,你几乎就到了--
IterableLike
上面有
GenIterableLike
TraversableLike
TraversableLike
上面只有
traversableone
GenTraversableLike

TraversableOnce
上面有
GenTraversableOnce
,就是这样:)

另一个用户提供的链接(也是)是一个很好的参考——您只需要知道这些类型中的每一个都有一个对应的
*Like
类型,该类型保存表示类型参数
Repr

但是从扩展集合的角度来看,您只需要找到在大多数情况下要扩展的最特定类型,例如
SeqLike
和extend
Seq[T]
Seq[T,YourCollectionType[T]


不过,在Scala的未来版本中,
Gen*
特征可能会被删除,从而使层次结构更简单。

在Scala-lang.org上有一个集合类层次结构。大多数父类实际上都是实现细节和优化技巧。如果你不在乎它,你可以忽略任何带有
的东西,比如最后的
模板
。将其应用到列表中,我们有:
列表好吧,首先你要确保你有你的铁口粮、手电筒和十英尺长的杆子,然后你下降,戳东西以确保它们不是陷阱。。。。更严重的是,集合层次结构是巨大的,其中大多数实际上在概念上做了一些事情。它不容易。至少现在大多数类型的人都会在他们的文档顶部解释他们的目的。(在你进入诸如
gentraversableone
之类的领域之前,大约还有三到四个层次)如果你只是对集合API中面向用户的部分感兴趣(或者在查看内部结构之前做一个准备),那么这组继承图是一个好的开始:;它不是完全最新的,但幸运的是它还没有过时。@Gouraysama这些是很好的图表,但我找不到
AbstractSeq
Product
GenericTraversableTemplate
LinearSeqLike
IterableLike
GenSeqLike
Parallelizable
在那里…这些图可能重复,但我找不到
AbstractSeq
Product
GenericTraversableTemplate
LinearSeqLike
LinearSeqLike
IterableLike
GenSeqLike
Parallelizable
在那里……通过扩展方法和查看定义类,我发现我学到了很多东西。例如,对于
List.isEmpty
它将显示SeqLike→ 易爆炸的→ 可遍历的→ 可遍历一次→ 一次优雅的旅行。然后,我可以按照
SeqLike
了解更多信息。然后我可以点击SeqLike.scala并检查源代码。。。
trait SeqLike[+A, +Repr] extends Any
                            with IterableLike[A, Repr]
                            with GenSeqLike[A, Repr]
                            with Parallelizable[A, ParSeq[A]]