24

我有如下所示的 scala 函数:

现在,根据 T 的类型(在我的情况下,它可以是DoubleBooleanLocalDate,我需要在ob. 像这样的东西(我知道代码没有意义,但我试图传达我的意思):

def X[T](ob: Observable[T]): Observable[T] = {
    //code  
    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 的 Erasure 属性,是否可以使用反射来完成工作?甚至可能吗?

4

1 回答 1

25

如果您使用的是 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

另请参阅这个冗长但很棒的答案

另请注意,我只瞥了一眼 scala 反射,因此可能有人会写一个更好的 TypeTag 用法示例。

于 2014-01-22T15:00:37.313 回答