Home > other >  How to pass array of types in Scala?
How to pass array of types in Scala?

Time:01-21

I am trying to create a method that will take a list of Objects and a list of Types and then check whether a particular object matches a particular type.

I tried to create a dummy example. In the following code validate method takes list of objects and a List of type then tried to validate the types of each object. I know following code is wrong but I just created to communicate the problem, it would be really great if you can tell me how can I do this in Scala.

object T extends App {
  trait MyT
  case class A(a: Int) extends MyT
  case class B(b: Int) extends MyT

  def validate(values: Seq[Any], types: Seq[MyT]): Seq[Boolean] =
    for ((v, ty: MyT) ← values.zip(types)) yield v.isInstanceOf[ty]

  // create objects
  val a = A(1)
  val b = B(1)

  // call validate method 
  validate(Seq(a, b), Seq(A, B))

}

CodePudding user response:

Types are not values, so you can't have a list of them.
But, you may use Class instead:

def validate(values: Seq[Any], types: Seq[Class[_ <: MyT]]): Seq[Boolean] =
  values.lazyZip(types).map {
    case (v, c) =>
      c.isInstance(v)
  }

Which can be used like this:

validate(Seq(a, b), Seq(classOf[A], classOf[B]))
// res: Seq[Boolean] = List(true, true)

You can see the code running here.

However, note that this will break if your classes start to have type parameters due to type erasure.


Note, I personally don't recommend this code since, IMHO, the very definition of validate is a code smell and I would bet you have a design error that lead to this situation.

I recommend searching for a way to avoid this situation and solve the root problem.

  •  Tags:  
  • Related