Por que é achatar declarado no GenericTraversableTemplate e não TraversableLike?
-
05-07-2019 - |
Pergunta
A assinatura do TraversableLike.flatMap
é o seguinte:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
A assinatura do GenericTraversableTemplate.flatten
é:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
Por que é o último método (que me parece diferir flatMap
apenas no sentido de que a função do transformador é implicit
) não definível em TraversableLike
como:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
Existe alguma razão que este deve ser o caso?
Solução
Eu acho que as mentiras resposta no código fonte:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
O parâmetro implícito para flatten
deve realmente ser A <:< Traversable[B]
(isto é. Uma afirmação de que o parâmetro genérico de GenericTraversableTemplate
é em si Traversable
). (Veja esta discussão lista de discussão para a discussão sobre por que ele está atualmente comentada.) o meu entendimento é que todos os métodos neste traço costumava ser definida em (alguns) o companheiro objetos de classes de coleção porque eram aplicáveis ??apenas para algumas instâncias (se isso é a palavra certa) de parâmetros de tipo. Esta construção <:<
permite que sejam feitos os métodos de instância.