是否可以match-case
执行功能?
我想为不同类型的函数定义一个行为。说我有以下可能性:
f: T => Int
f: T => String
f: T => Lis[Int]
f: T => Boolean
f: T => Double
对于这些选项中的每一个,我都有一个功能;例如Int
输出:
def doThisForInt(f: T => Int) = { ... }
这对于Boolean
输出:
`
def doThisForBoolean(f:T => Boolean)= {...}
现在假设给出了一个函数定义:val f = (input: T) => true
。我们应该选择相应的案例f: T => Boolean
。
请注意,所有这些功能在输出类型上都有所不同。或者,给定f
可以获得此函数的输出类型吗?
答案 0 :(得分:4)
import scala.reflect.runtime.universe._
def doThisForInt(f: T => Int) = ???
def printType[R: TypeTag](f: T => R) = typeOf[R] match {
case t if t =:= typeOf[Int] =>
val toInt: (T) => Int = f.asInstanceOf[T => Int]
doThisForInt(toInt)
case t if t =:= typeOf[Double] =>
// ...
case t if t =:= typeOf[List[Int]] =>
// ...
}
printType((x: T) => 1) // int
printType((x: T) => 2.0) // double
printType((x: T) => List(2)) // list
正如您所看到的那样,它可能,但不是很优雅,反对good practices。
instanceOf检查的链通常可以用虚方法替换(参见example),函数的结果类型可能是类型参数。如果不了解您的用例的更多上下文,很难提供更多建议。