¿Por qué se declara flatten en GenericTraversableTemplate y no en TraversableLike?
-
05-07-2019 - |
Pregunta
La firma de TraversableLike.flatMap
es la siguiente:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
La firma de GenericTraversableTemplate.flatten
es:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
¿Por qué el último método (que me parece diferente de flatMap
solo en el sentido de que la función del transformador es implicit
) no se puede definir en TraversableLike
como:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
¿Hay alguna razón para que este sea el caso?
Solución
Creo que la respuesta está en el código fuente:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
El parámetro implícito para flatten
en realidad debería ser A <:< Traversable[B]
(es decir, una afirmación de que el parámetro genérico de GenericTraversableTemplate
es en sí Traversable
). (Consulte este hilo de la lista de correo para discutir sobre por qué está actualmente comentado.) Entiendo que todos los métodos en este rasgo solían definirse en (algunos) los objetos complementarios de las clases de colección porque solo eran aplicables para algunas instancias (si eso es la palabra correcta) de los parámetros de tipo. Esta construcción <:<
les permite hacerse métodos de instancia.