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.