在Scala中对类型参数进行模式匹配。

6 浏览
0 Comments

在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的擦除属性,能否使用反射来完成这个任务?这是否可行?

0
0 Comments

在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

0