TraversableLike.flatMap
的签名如下:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
GenericTraversableTemplate.flatten
的签名是:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
为什么后一种方法(在我看来与flatMap
不同只是在变换器函数为implicit
)的意义上不能在TraversableLike
上定义为:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
是否有某种原因必须如此?
答案 0 :(得分:2)
我认为答案在于源代码:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
flatten
的隐式参数实际上应该是A <:< Traversable[B]
(即断言GenericTraversableTemplate
的泛型参数本身是Traversable
)。 (请参阅this mailing list thread以了解它当前被注释掉的原因。)我的理解是,此特征中的所有方法都曾在(某些)集合类的伴随对象上定义,因为它们仅适用于某些实例化(如果这是正确的话)类型参数。这个<:<
构造允许它们成为实例方法。