scala - 迷失在 Scala 集合的继承图中

标签 scala inheritance collections types complexity-theory

今天想了解List的父类(super class)型:

sealed abstract class List[+A] extends AbstractSeq[A]
                                  with LinearSeq[A]
                                  with Product
                                  with GenericTraversableTemplate[A, List]
                                  with LinearSeqOptimized[A, List[A]]

哇,原来如此 List已经有五个直接父类(super class)型。让我们随机选择一个:
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]

啊,看来我们到了某个地方,只剩下一个父类(super class)型:
trait SeqLike[+A, +Repr] extends Any
                            with IterableLike[A, Repr]
                            with GenSeqLike[A, Repr]
                            with Parallelizable[A, ParSeq[A]]

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

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

最佳答案

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

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

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

关于scala - 迷失在 Scala 集合的继承图中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16267869/

相关文章:

java - 空列表解码 Java 对象

performance - 如果在列表中的任意一组点之间,则过滤 Spark DataFrame

java - Kotlin、Scala 和 Java 的 Gradle 构建失败

ruby-on-rails - Mongoid继承而不改变集合

c# - 在 C++ 中实现接口(interface)?

java - 在 Java 中对集合进行连接和分离的最佳方法

java - "infinite"迭代器的设计是否糟糕?

scala - Scala 中的 Spark : How to avoid linear scan for searching a key in each partition?

scala - Try和Either有什么区别?

c# - 如何将一种对象类型的对象深度复制到共享继承结构的另一种对象类型