Ich habe versucht, mehr Scala zu lernen und lief in this interesting article diskutieren F-begrenzte Typen. Ich war besonders an der abschließenden Diskussion über die Arbeit mit Wertesammlungen mit solchen Typen interessiert.Funktion Anwendung über Sammlungen mit F-begrenzten Typen
Ein einfaches Beispiel:
abstract class AbsClass[A <: AbsClass[_]] {
this: A =>
def me: A = this
}
def me2[A <: AbsClass[A]](a: A): A = a
case class C1(v: Int) extends AbsClass[C1]
case class C2(v: Int) extends AbsClass[C2]
Wie im Blog-Beitrag gezeigt, wir Existenzquantor uns zu ermöglichen, können me2
über eine Liste von C1
anrufen und C2
scala> List[A forSome {type A <: AbsClass[A] }](C1(1), C2(2)).map(me2(_))
res2: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2))
Jetzt Ich habe versucht, ein paar Variationen über den Typ für die Liste, und ich hatte gehofft, jemand mit mehr Erfahrung könnte einige der Subtilität hinweisen , dass ich Missi bin ng.
Die folgenden Werke, wie ich es
scala> val l2 = List[A forSome {type A <: AbsClass[A] }](C1(1), C2(2))
l2: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2))
scala> l2.map(_.me)
res4: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2))
zu
erwartet kann ich auch_.me
nennen und die Liste bezeichnen als Instanzen
AbsClass[A] forSome {type A}
, wie in
scala> val l: List[AbsClass[_]] = List(C1(1), C2(2)).map(_.me)
l: List[AbsClass[_]] = List(C1(1), C2(2))
enthält, aber wenn ich versuche, die anzuwenden gleiche Karte zu l
wieder, verliere ich Typinformationen und bin mit einem List[Any]
stecken. Gibt es eine Möglichkeit, den Typ hier zu erhalten?