Scala 按动态类型作为函数参数的模式匹配

Scala 按动态类型作为函数参数的模式匹配,scala,Scala,我正在使用scala,并尝试创建一个方法,该方法将返回一个实例列表,该列表由通过函数参数传递的给定类型过滤: 我尝试了以下方法,但它甚至没有编译: trait A trait B extends A trait C extends A case class B1() extends B {} case class B2() extends B {} case class C1() extends C {} case class C2() extends C {}

我正在使用scala,并尝试创建一个方法,该方法将返回一个实例列表,该列表由通过函数参数传递的给定类型过滤:

我尝试了以下方法,但它甚至没有编译:

  trait A

  trait B extends A
  trait C extends A

  case class B1() extends B {}
  case class B2() extends B {}

  case class C1() extends C {}
  case class C2() extends C {}

  def filterByType[F <: A](list: List[A], t: Class[F]): List[F] = list flatMap {
    case f: F => Some(f)
    case _ => None
  }

  val list: List[A] = List(B1(), B2(), C1(), C2()) // type of A

  val filteredList: List[B] = filterByType(list, Class[B]) // This should return a sublist like List(B1(), B2()) and be type of B

  println(filteredList)
在scala中有这样的方法吗?正确的做法是什么? 谢谢

编辑:
我也尝试过通过[B]类考试,但也没有运气。

你可以这样做: 使用

注意:由于类型擦除,这有一些限制,但它似乎适用于您的用例。 对于更通用的方法,我将创建自己的typeclass。

仅使用类[F]即可

def filterByType[F <: A](list: List[A], t: Class[F]): List[F] = list flatMap {
  case f if t.isInstance(f) => Some(t.cast(f))
  case _ => None
}
或者更短但效率更低

def filterByType[F <: A](list: List[A], t: Class[F]): List[F] = list flatMap { 
  x => Try { t.cast(x) }.toOption 
}
正如路易斯·米格尔·梅西亚·苏亚雷斯(Luis Miguel Mejía Suárez)的回答所示,模式匹配对以下方面有着特殊的支持:F是一个类标记[F]是可用的,但它不扩展到任何其他方面

def filterByType[F <: A](list: List[A], t: Class[F]): List[F] = list flatMap {
  case f if t.isInstance(f) => Some(t.cast(f))
  case _ => None
}
def filterByType[F <: A](list: List[A], t: Class[F]): List[F] = list flatMap { 
  x => Try { t.cast(x) }.toOption 
}