Ich implementiere eine Datenstruktur. Obwohl es in keiner der Standard-Sammeleigenschaften von Scala passt, möchte ich die to[Col[_]]
-Methode einbeziehen, die in einer Builder-Fabrik Standard-Scala-Sammlungen generieren kann.Hinzufügen einer `to [Col [_]]` Methode für eine kovariante Sammlung
dieses Nehmen wir nun an, kopiert von GenTraversableOnce
:
trait Foo[+A] {
def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A]]): Col[A]
}
Dieser schlägt mit error: covariant type A occurs in invariant position
.
Also wie kann GenTraversableOnce
dies erreichen? Ich kann im Quellcode sehen, dass sie eine annotation.unchecked.uncheckedVariance
...
hinzufügen, die wie ein schmutziger Trick aussieht. Wenn der Tipper dies normalerweise ablehnt, wie kann das mit sicher und ausgeschaltet werden?
Sie don brauche wirklich 'A' und 'A1' überhaupt nicht. Das funktioniert auch: 'def zu [B, Col [_]] (implizite cbf: CanBuildFrom [Nichts, A, Col [B]]): Col [B]'. Auch das sieht unnötig einschränkend aus, da es nur das Ergebnis der Form "Col [B]" erlaubt. Dies sieht allgemeiner und einfacher aus: 'def zu [R] (implizite cbf: CanBuildFrom [Nichts, A, R]): R'. – Rotsor