Pourquoi est-ce que flatten est déclaré sur GenericTraversableTemplate et non sur TraversableLike?
-
05-07-2019 - |
Question
La signature de TraversableLike.flatMap
est la suivante:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
La signature de GenericTraversableTemplate.flatten
est:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
Pourquoi cette dernière méthode (qui, à mon avis, diffère de flatMap
uniquement dans le sens où la fonction de transformation est implicit
) ne peut pas être définie sur TraversableLike
comme:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
Y a-t-il une raison pour que cela soit le cas?
La solution
Je pense que la réponse réside dans le code source:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
Le paramètre implicite de flatten
doit en réalité être A <:< Traversable[B]
(c.-à-d. une assertion selon laquelle le paramètre générique de GenericTraversableTemplate
est lui-même Traversable
). (Voir cette liste de diffusion Pour en savoir plus sur les raisons pour lesquelles il est actuellement commenté.) À ma connaissance, toutes les méthodes de cet attribut étaient définies sur (certains) des objets compagnon des classes de collection, car elles ne s'appliquaient que pour certaines instanciations (si c'est le cas). le mot juste) de type paramètres. Cette <:<
construction leur permet de créer des méthodes d'instance.