Scala type pattern matching

131 Views Asked by At

I want to implement a pattern matching over types of case class. Caurrently I have this idea in mind:

val T = typeOf[Int]
val S = typeOf[String]
// other primitive types
val O = typeOf[Option[_]]  // doesn't work for all generic types
val X = typeOf[AnyRef]     // doesn't work at all

typeOf[A].members.filter(!_.isMethod).map(_.typeSignature).foreach {
  case T => println("int")
  case S => println("string")
  // other primitive types
  case O => println("option")
  case X => println("other")
}

But I have a two problems:

  1. How to create a type which would match any Option, List or Map in spite of there generic types?
  2. How to create a type which would match any other custom types?

Any ideas would be appreciated.

1

There are 1 best solutions below

0
Lyashko Kirill On BEST ANSWER

The solution which I was able to find:

val T = typeOf[Int]
val S = typeOf[String]

typeOf[A].members.filter(!_.isMethod).map(_.typeSignature).foreach {
  case T => println("int")
  case S => println("string")
  // other primitive types
  case x if x.erasure =:= typeOf[Option[Any]] => println("option")
  case x if x <:< typeOf[AnyRef] => println("other")
}