迷失在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
和extendSeq[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]]