在Scala中对类型参数进行模式匹配。
在Scala中对类型参数进行模式匹配。
我有一个类似于这样的Scala函数:
现在,根据T的类型(在我的情况下,可能是Double、Boolean和LocalDate),我需要在ob上应用函数。像这样(我知道代码没有意义,但我试图表达我的意思):
def X[T](ob: Observable[T]): Observable[T] = {
//代码
T match {
case Double => DoSomething1(ob:Observable[Double]):Observable[Double]
case Boolean => DoSomething2(ob:Observable[Boolean]):Observable[Boolean]
case LocalDate => DoSomething3(ob:Observable[LocalDate]):Observable[LocalDate]
}
}
考虑到Scala的擦除属性,能否使用反射来完成这个任务?这是否可行?
在Scala中,通过类型参数进行模式匹配的问题出现的原因是在2.10版本以上,使用TypeTag更为合适。下面的代码是一个例子:
import reflect.runtime.universe._ class Observable[Foo] def X[T: TypeTag](ob: Observable[T]) = ob match { case x if typeOf[T] <:< typeOf[Double] => println("Double obs") case x if typeOf[T] <:< typeOf[Boolean] => println("Boolean obs") case x if typeOf[T] <:< typeOf[Int] => println("Int obs") } X(new Observable[Int]) // Int obs
上述代码的意思是,根据传入的Observable的类型参数T的具体类型,进行模式匹配并打印相应的结果。例如,当传入Observable[Int]时,打印的结果为"Int obs"。
需要注意的是,在这种情况下,对ob进行模式匹配是多余的,因为它完全基于if-else逻辑,并且x的类型不会改变。
有人可能会问,是否有一种在编译时根据T的类型进行匹配的方法?换句话说,这个答案是唯一的答案,没有其他方法了吗?我认为是的。有一篇名为"Ways to Pattern Match Generic Types in Scala"的博文提供了更多的见解和替代方案。
现在,"Ways to Pattern Match Generic Types in Scala"博文可以在这里找到:lepovirta.org/posts/… 或者 gist.github.com/jkpl/5279ee05cca8cc1ec452fc26ace5b68b。