Warum ist Flatten auf GenericTraversableTemplate erklärt und TraversableLike nicht?
-
05-07-2019 - |
Frage
Die Unterzeichnung TraversableLike.flatMap
ist wie folgt:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
Die Unterzeichnung GenericTraversableTemplate.flatten
ist:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
Warum ist die letztere Methode (die ich scheint von flatMap
nur in dem Sinne zu unterscheiden, dass der Transformator Funktion implicit
ist) nicht definierbar auf TraversableLike
wie:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
Gibt es einen Grund, dass dies der Fall sein muss?
Lösung
Ich glaube, die Antwort liegt im Quelltext:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
Der implizite Parameter sollte auf flatten
tatsächlich A <:< Traversable[B]
(dh. Eine Behauptung, dass der generische Parameter von GenericTraversableTemplate
selbst Traversable
). (Siehe dieser Mailing-List-Thread für die Diskussion darüber, warum es zur Zeit ist als Kommentar gekennzeichnet.) Mein Verständnis ist, dass alle Verfahren in dieser Eigenschaft verwendet, auf (einige) der Begleiter Gegenstände der Sammlung Klassen definiert werden, da sie für einige instantiations nur anwendbar waren (wenn das das richtige Wort) des Typparameters. Dieses <:<
Konstrukt ermöglicht es ihnen Methoden hergestellt Instanz werden.