Zabawne, że nikt nie dał takiego typu, że będzie działał pod. Oto jeden taki:
def foo(x: Int): String = x.toString
def bar(x: Boolean): String = x.toString
val m = Map[String, (Nothing) => String]("hello" -> foo, "goodbye" -> bar)
Powodem dlaczego to działa w ten sposób dlatego, Function1
jest przeciwwskazane wariant na wejściu, więc (Nothing) => String
jest nadklasą (Int) => String
. Jest także współ-wariantem na wyjściu, więc (Nothing) => Any
będzie nadklasą dla każdego innego Function1
.
Oczywiście, nie możesz tego użyć. Bez manifestów nie można nawet odkryć, jaki jest oryginalny typ Function1
. Możesz spróbować czegoś takiego:
def f[T : Manifest](v: T) = v -> manifest[T]
val m = Map[String, ((Nothing) => String, Manifest[_])]("hello" -> f(foo), "goodbye" -> f(bar))
val IntManifest = manifest[Int]
val BooleanManifest = manifest[Boolean]
val StringManifest = manifest[String]
m("hello")._2.typeArguments match {
case List(IntManifest, StringManifest) =>
m("hello")._1.asInstanceOf[(Int) => String](5)
case List(BooleanManifest, StringManifest) =>
m("hello")._1.asInstanceOf[(Boolean) => String](true)
case _ => "Unknown function type"
}
Nawet jeśli składnia w twoim pytaniu zadziałała, musi być coś śmiesznego, co robisz z typami, aby wysłać odpowiedni typ do funkcji, którą dostajesz z mapy. Tutaj jest o wiele więcej komplikacji. Co tak naprawdę naprawdę robisz? Być może istnieje całkowicie lepsze rozwiązanie, które nie opiera się na mapie funkcji różnych typów. –