mam jakiś kod tak:Jak mogę napisać funkcję ma polimorficzny typ zwracania oparty na argumencie typu tego typu?
sealed trait Foo[A] {
def value: A
}
case class StringFoo(value: String) extends Foo[String]
case class IntFoo(value: Int) extends Foo[Int]
Chciałbym mieć funkcję, która może używać rodzaju A
dany typ parametru podtypem jest.
// Hypothetical invocation
val i: Int = dostuff[IntFoo](param)
val s: String = dostuff[StringFoo](param)
nie mogę dowiedzieć się, w jaki sposób zadeklarować dostuff
w sposób, który działa. Najbliższy rzeczą, jaką mogę wymyślić jest
def dostuff[B <: Foo[A]](p: Param): A
Ale to nie działa, ponieważ A
jest niezdefiniowane w tej pozycji. Mogę zrobić coś
def dostuff[A, B <: Foo[A]](p: Param): A
Ale potem muszę powołać go jak dostuff[String, StringFoo](param)
który jest dość brzydki.
Wydaje się, że kompilator powinien mieć wszystkie informacje potrzebne do poruszania A
zmierzającej do zwracanego typu, w jaki sposób można dokonać tej pracy, zarówno w standardowej Scala lub z biblioteką. Jestem na scala 2.10 obecnie, jeśli to wpływa na odpowiedź. Jestem otwarty na 2,11-jedynym rozwiązaniem, jeśli jest to możliwe tam, ale niemożliwe 2.10
Tak właśnie poszedłem, ale zamiast 'ev: B => Foo [A]' użyłem 'ev: B <:
Daenyth