Es curioso que nadie realmente dio un tipo que sería trabajo. Aquí es uno de esos:
def foo(x: Int): String = x.toString
def bar(x: Boolean): String = x.toString
val m = Map[String, (Nothing) => String]("hello" -> foo, "goodbye" -> bar)
La razón de por qué funciona de esta manera es porque es Function1
contra-variante de la entrada, por lo (Nothing) => String
es una superclase de (Int) => String
. También es una variante en la salida, por lo que (Nothing) => Any
sería una superclase de cualquier otra Function1
.
Por supuesto, no puede usarlo así. Sin manifiestos, ni siquiera puede descubrir cuál es el tipo original de Function1
. Usted podría intentar algo como esto, sin embargo:
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"
}
Incluso si la sintaxis en su pregunta trabajó, tiene que haber algo gracioso que estás haciendo con tipos de enviar el tipo correcto de la función se obtiene a partir del mapa. Hay muchas más complicaciones aquí. ¿Qué estás ** realmente ** tratando de hacer? Tal vez haya una solución mejor que no dependa de un mapa de funciones de diferentes tipos. –