ho qualche codice come questo:Come posso scrivere una funzione con un tipo di ritorno polimorfico basato sull'argomento tipo del suo parametro tipo?
sealed trait Foo[A] {
def value: A
}
case class StringFoo(value: String) extends Foo[String]
case class IntFoo(value: Int) extends Foo[Int]
mi piacerebbe avere una funzione in grado di utilizzare il tipo di A
dato parametro tipo di un sottotipo.
// Hypothetical invocation
val i: Int = dostuff[IntFoo](param)
val s: String = dostuff[StringFoo](param)
io non riesco a capire come dichiarare dostuff
in un modo che funziona. La cosa più vicina che posso capire è
def dostuff[B <: Foo[A]](p: Param): A
Ma questo non funziona perché A
è definito in quella posizione. Posso fare qualcosa di simile
def dostuff[A, B <: Foo[A]](p: Param): A
Ma poi devo invocarlo come dostuff[String, StringFoo](param)
che è piuttosto brutto.
Sembra che il compilatore dovrebbe avere tutte le informazioni di cui ha bisogno per muoversi A
attraverso al tipo di ritorno, come posso fare questo lavoro, sia in scala standard o con una libreria. Sono attualmente su scala 2.10 se questo influisce sulla risposta. Sono aperto a un 2.11-unica soluzione se è possibile lì, ma impossibile in 2.10
Questo è quello che sono andato con, ma invece di 'ev: B => Foo [A]' Ho usato 'ev: B <:
Daenyth