Почему flatten объявлен в GenericTraversableTemplate, а не в TraversableLike?
-
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
). (См. эту ветку списка рассылки для обсуждения того, почему это в настоящий момент закомментировано.) Насколько я понимаю, все методы этой черты раньше определялись (некоторые из) сопутствующих объектов классов коллекции, потому что они были применимы только для некоторых экземпляров (если это правильное слово) параметров типа. Эта конструкция <:<
позволяет им создавать методы экземпляра.