Pourquoi est-ce que flatten est déclaré sur GenericTraversableTemplate et non sur TraversableLike?

StackOverflow https://stackoverflow.com/questions/1802828

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top