如何在 Scala 中传递类型数组?

How to pass array of types in Scala?

我正在尝试创建一个方法,该方法将获取对象列表和类型列表,然后检查特定对象是否与特定类型匹配。

我试图创建一个虚拟示例。在下面的代码中,验证方法采用对象列表和类型列表,然后尝试验证每个对象的类型。我知道下面的代码是错误的,但我只是为了传达这个问题而创建的,如果你能告诉我如何在 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))

}

类型不是值,因此您无法获得它们的列表。
但是,您可以使用 Class 代替:

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

可以这样使用:

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

可以看到代码运行 here.

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


请注意,我个人不推荐此代码,因为恕我直言,validate 的定义本身就是一种代码味道,我敢打赌您的设计错误会导致这种情况。

我建议寻找一种方法来避免这种情况并解决根本问题。