Совпадение шаблонов в родовом типе в Scala

У меня есть функция scala, которая выглядит так:

Теперь, в зависимости от типа T (в моем случае это может быть Double, Boolean и LocalDate), Мне нужно применить функции на 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]
    }
}

Принимая во внимание свойство Erasure Scala, можно ли как-то использовать отражение, чтобы выполнить работу? Возможно ли это?

Ответ 1

Я бы пошел с TypeTag, если вы на 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

См. также этот длинный, но удивительный ответ

Обратите внимание, что я только заглянул в отражение scala, поэтому, вероятно, кто-то может написать лучший пример использования TypeTag.