为什么在GenericTraversableTemplate而不是TraversableLike上声明flatten?

时间:2009-11-26 10:20:01

标签: generics scala scala-2.8 scala-collections

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

是否有某种原因必须如此?

1 个答案:

答案 0 :(得分:2)

我认为答案在于源代码:

def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]

flatten的隐式参数实际上应该是A <:< Traversable[B](即断言GenericTraversableTemplate的泛型参数本身是Traversable)。 (请参阅this mailing list thread以了解它当前被注释掉的原因。)我的理解是,此特征中的所有方法都曾在(某些)集合类的伴随对象上定义,因为它们仅适用于某些实例化(如果这是正确的话)类型参数。这个<:<构造允许它们成为实例方法。