我有一个包含不同子类型对象的 Scala 集合。
abstract class Base
class A extends Base
class B extends Base
val a1 = new A()
val a2 = new A()
val b = new B()
val s = List(a1, a2, b)
我想过滤掉所有
A
对象或 B
对象。如果我知道要在编译时过滤的对象,我可以轻松地做到这一点。s.filter(_.isInstanceOf[A]) // Give me all the As
s.filter(_.isInstanceOf[B]) // Give me all the Bs
如果我只知道在运行时过滤的对象类型,我可以这样做吗?我想写一个这样的函数。
def filterType(xs:List[Base], t) = xs.filter(_.isInstanceOf[t])
哪里
t
指示我是否想要 A
类型的对象或 B
.当然,由于类型删除,我实际上不能这样写。是否有一种惯用的 Scala 方法可以使用类型标签来解决这个问题?我一直在阅读 Scala 类型标签文档和相关的 StackOverflow 帖子,但我无法弄清楚。
最佳答案
这已经出现了几次。重复,有人吗?
scala> trait Base
defined trait Base
scala> case class A(i: Int) extends Base
defined class A
scala> case class B(i: Int) extends Base
defined class B
scala> val vs = List(A(1), B(2), A(3))
vs: List[Product with Serializable with Base] = List(A(1), B(2), A(3))
scala> def f[T: reflect.ClassTag](vs: List[Base]) = vs collect { case x: T => x }
f: [T](vs: List[Base])(implicit evidence$1: scala.reflect.ClassTag[T])List[T]
scala> f[A](vs)
res0: List[A] = List(A(1), A(3))
关于scala - 在 Scala 中,如何在运行时按具体类型进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438825/