【问题标题】:Lost in the inheritance graph of Scala's collections迷失在 Scala 集合的继承图中
【发布时间】:2013-04-22 11:35:40
【问题描述】:

今天想了解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]]

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

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

【问题讨论】:

  • 嗯,首先你确保你有你的铁口粮、火炬和十英尺长的杆子,然后你下降,戳东西以确保它们不是陷阱......更严重的是,集合层次结构很大,其中大部分实际上在概念上做了一些事情。这并不容易。至少大多数类型现在在他们的文档顶部解释了它们的用途。 (在GenTraversableOnce 等内容触底之前,大约还有三到四个级别。)
  • 如果您只是对集合 API 的面向用户的部分感兴趣(或者作为查看内部结构之前的热身),那么这组继承图是一个好的开始:decodified.com/scala/collections-api.xml ;它不是完全最新的,但幸运的是它还没有过时。
  • @gourlaysama 这些图表不错,但我找不到AbstractSeqProductGenericTraversableTemplateLinearSeqOptimizedLinearSeqLikeSeqLikeIterableLikeGenSeqLikeParallelizable 在那里...

标签: scala inheritance collections types complexity-theory


【解决方案1】:

一旦你到达SeqLike,你就快到了——IterableLike 上面只有GenIterableLikeTraversableLikeTraversableLike 上面只有TraversableOnceGenTraversableLike

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

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

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

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

【讨论】:

    【解决方案2】:

    在 scala-lang.org 上有一个集合类层次结构的 nice overview

    【讨论】:

    • 这些图表不错,但我找不到AbstractSeqProductGenericTraversableTemplateLinearSeqOptimizedLinearSeqLikeSeqLikeIterableLikeGenSeqLike 或 @ 987654330@在那里...
    【解决方案3】:

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

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

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

    【讨论】:

    • 我发现通过扩展方法并查看定义类,我学到了很多东西。例如List.isEmpty,它将显示 SeqLike → IterableLike → TraversableLike → TraversableOnce → GenTraversableOnce。然后我可以关注SeqLike 并了解更多信息。然后我可以点击 SeqLike.scala 并检查源代码...
    猜你喜欢
    • 2012-03-14
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2011-12-02
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多