2

的签名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

有什么理由必须是这种情况吗?

4

1 回答 1

2

我认为答案在于源代码:

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

to 的隐含参数flatten实际上应该是A <:< Traversable[B](即断言其泛型参数GenericTraversableTemplate是它本身Traversable)。(请参阅这个邮件列表线程,讨论为什么它目前被注释掉。)我的理解是,这个 trait 中的所有方法曾经被定义在(一些)集合类的伴随对象上,因为它们只适用于一些实例化(如果这是正确的话)类型参数。这种<:<构造允许它们成为实例方法。

于 2010-04-11T20:21:44.223 回答