Ich habe einige Code wie folgt:Wie kann ich eine Funktion schreiben, die einen polymorphen Rückgabetyp hat, basierend auf dem Typargument seines Typparameters?
sealed trait Foo[A] {
def value: A
}
case class StringFoo(value: String) extends Foo[String]
case class IntFoo(value: Int) extends Foo[Int]
Ich möchte eine Funktion haben, die den A
Typ einen Subtyp des Typs Parameter angegeben verwenden können.
// Hypothetical invocation
val i: Int = dostuff[IntFoo](param)
val s: String = dostuff[StringFoo](param)
Ich kann nicht herausfinden, wie dostuff
in einer Art und Weise zu erklären, die funktioniert. Das nächste, was ich herausfinden kann, ist
def dostuff[B <: Foo[A]](p: Param): A
Aber das funktioniert nicht, weil A
in dieser Position nicht definiert ist. Ich kann so etwas wie
def dostuff[A, B <: Foo[A]](p: Param): A
tun, aber dann habe ich es wie dostuff[String, StringFoo](param)
aufrufen, die ziemlich hässlich ist.
Es scheint, wie der Compiler sollten alle Informationen, es A
hinüber zum Rückgabetyp bewegen muss, wie kann ich diese Arbeit machen, entweder in Standard-scala oder mit einer Bibliothek. Ich bin gerade auf Scala 2.10, wenn sich das auf die Antwort auswirkt. Ich bin offen für eine 2,11-only Lösung, wenn es möglich ist, es aber unmöglich in 2.10
Dies ist, was ich ging, aber anstelle von 'ev: B => Foo [A]' ich verwendet 'ev: B <:
Daenyth