scala generics reflection pattern-matching erasure

Patrón de coincidencia en el tipo genérico en Scala



generics reflection (1)

Tengo una función de Scala que se ve así:

Ahora, dependiendo del tipo de T (en mi caso, puede ser Double , Boolean y LocalDate ), necesito aplicar funciones en ob . Algo como esto (sé que el código no tendrá sentido pero estoy tratando de transmitir lo que quiero hacer):

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] } }

Teniendo en cuenta la propiedad Borrado de Scala, ¿se puede utilizar la reflexión de alguna manera para hacer el trabajo? ¿Es incluso posible?


Iría con TypeTag si estás en 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

Véase también esta respuesta larga, pero impresionante

Tenga en cuenta también que solo eché un vistazo al reflejo de Scala, por lo que es probable que alguien escriba un mejor ejemplo del uso de TypeTag.