"特质"和"模板特征"之间有什么区别?

Ada*_*dam 21 scala

看看Traversable和TraversableLike的scaladoc,我很难弄清楚它们之间的区别是什么(除了那个扩展另一个).文档中唯一明显的区别是它表示Traversable是一个"特征"而TraversableLike是一个"模板特征".但谷歌搜索"模板特征"并没有揭示这个术语的定义.救命!

Aar*_*rup 22

我没有在Scala中看到这个通用术语,我认为它特定于Scala集合API的设计.您可以通过阅读Scala集合的架构(尤其是"分解常见操作"一节)[1]和Scala集合SID来了解更多信息.SID的§4.2是相关的,尽管它们在那里被称为"实施特征":

诸如Traversable或Vector之类的集合类从实现特征继承其所有具体方法实现.这些特征以Like suf fi x命名; 例如,VectorLike是Vector的实现特性,TraversableLike是Traversable的实现特性.

简而言之,它们的目的是将实现分开以便在集合层次结构之外使用(例如,StringOps扩展TraversableLike但不是Traversable),并以保留集合类型的方式分解常见操作(请参阅IttayD的答案以获得更详尽的解释).

我应该注意,除非您正在扩展集合层次结构,否则您确实不需要关心这些类.对于普通应用,专注于Traversable,Iterable,Seq,等特点.如果您不熟悉Scala Collections API,我建议您从Scala 2.8 Collection API文档开始,然后根据需要引用scaladoc.你不能期望通过scaladoc看到"大局".

[1]这个链接归功于michid

  • 谢谢你的出色答案!然而,最后一句话让我感到很难过:"你不能期望通过scaladoc看到'大局'" - 多么不幸...我觉得在Java标准库的情况下(至少对于自1.1以来一直存在的"核心"包java.lang,java.util等,我能够通过查看javadoc来了解全局. (2认同)

Itt*_*ayD 22

XXXLike特性在添加Repr泛型参数方面具有重要作用.应该返回相同集合类型的方法(如filter,map,flatMap)在低级特征(TraversableLike)中实现.要对其返回类型进行编码,这些特征会收到它:

trait TraversableLike[+A, +Repr] ...
  ...
  def filter(p: A => Boolean): Repr = {
Run Code Online (Sandbox Code Playgroud)

(对于map和flatMap,问题比较复杂,我不会在这里讨论)

现在说你有一个新类型的集合.你可以这样做:

 trait MyCollection[+A] extends TraversableLike[A, MyCollection]
Run Code Online (Sandbox Code Playgroud)

但是如果有人想要扩展你的集合,那么他们就会遇到来自各种继承方法的MyCollection的返回值.

所以相反,你创建:

 trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr]
Run Code Online (Sandbox Code Playgroud)

 trait MyCollection[+A] extends MyCollectionLike[A, MyCollection]
Run Code Online (Sandbox Code Playgroud)

任何想要扩展你的收藏的人都扩展了MyCollectionLike