Scala:匹配泛型函数的案例

时间:2016-05-13 15:22:36

标签: scala

是否可以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可以获得此函数的输出类型吗?

1 个答案:

答案 0 :(得分:4)

您正在寻找

TypeTags

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),函数的结果类型可能是类型参数。如果不了解您的用例的更多上下文,很难提供更多建议。