Забавно, что на самом деле никто не дал тип, который будет работать.Вот один такой:
def foo(x: Int): String = x.toString
def bar(x: Boolean): String = x.toString
val m = Map[String, (Nothing) => String]("hello" -> foo, "goodbye" -> bar)
Причина, по которой он работает таким образом, заключается в том, что Function1
является противоположным вариантом на входе, поэтому (Nothing) => String
является суперклассом (Int) => String
.Он также является ко-вариантом на выходе, поэтому (Nothing) => Any
будет суперклассом для любого другого Function1
.
Конечно, вы не можете использовать его таким образом.Без манифестов вы даже не сможете раскрыть, что такое оригинальный тип Function1
.Вы можете попробовать что-то вроде этого, хотя:
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"
}