Pattern matching on generic type in Scala
14,872
I would go with TypeTag if you're on 2.10+
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
See also this lengthy, but awesome answer
Note also that I only took a glimpse at scala reflection, so likely somebody may write a better example of TypeTag usage.
Comments
-
Core_Dumped almost 2 years
I have scala function that looks like this:
Now, depending upon the type of T (In my case, it can be
Double
,Boolean
andLocalDate
), I need to apply functions onob
. Something like this (I know the code will make no sense but I am trying to convey what I mean to do):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] } }
Taking into consideration the Erasure property of Scala, can reflection be somehow used to get the job done? Is it even possible?