为什么在GenericTraversableTemplate而不是TraversableLike上声明flatten?
-
05-07-2019 - |
题
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
)。 (参见此邮件列表主题讨论为什么它当前被注释掉了。)我的理解是这个特征中的所有方法都曾经在(某些)集合类的伴随对象上定义,因为它们只适用于某些实例化(如果是这样的话)正确的类型参数。这个<:<
构造允许它们成为实例方法。
不隶属于 StackOverflow