10

今天我想了解 的超类型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]

啊,看来我们到了某个地方,只剩下一个超类型:

trait SeqLike[+A, +Repr] extends Any
                            with IterableLike[A, Repr]
                            with GenSeqLike[A, Repr]
                            with Parallelizable[A, ParSeq[A]]

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

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

4

3 回答 3

6

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

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

此外,如果您想/需要知道给定方法的实际实现位置,请单击 scaladoc 中的方法签名以展开 de 描述。定义类字段显示了到实现位置的链接。

于 2013-04-29T10:05:45.653 回答
1

一旦你到达SeqLike,你就快到了 -IterableLike刚好在它之上,GenIterableLike只有在它之上。TraversableLikeTraversableLikeTraversableOnceGenTraversableLike

并在TraversableOnceGenTraversableOnce之上,就是这样:)

其他用户提供的链接(也是http://docs.scala-lang.org/overviews/collections/overview.html)是一个很好的参考——你只需要知道这些类型中的每一个都有一个对应的*Like类型保存表示类型参数Repr

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

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

于 2013-04-29T08:41:21.203 回答
0

在 scala-lang.org 上有一个关于集合类层次结构的很好的概述。

于 2013-04-29T08:42:49.417 回答