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

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

有帮助吗?

解决方案

我认为答案在于源代码:

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

flatten的隐式参数实际上应该是A <:< Traversable[B](即断言GenericTraversableTemplate的泛型参数本身是Traversable)。 (参见此邮件列表主题讨论为什么它当前被注释掉了。)我的理解是这个特征中的所有方法都曾经在(某些)集合类的伴随对象上定义,因为它们只适用于某些实例化(如果是这样的话)正确的类型参数。这个<:<构造允许它们成为实例方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top