scala - 在 Scala 中,如何在运行时按具体类型进行过滤?

标签 scala type-erasure

我有一个包含不同子类型对象的 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/

相关文章:

c++ - Constexpr 可构造函数对象

Scala:如何捕获父类的构造函数抛出的异常?

斯卡拉 2.10 : why there is a type mismatch?

scala - 自定义 extraLogger 在 sbt 中未收到 [成功] 消息?

java - 无法构造泛型类型参数,该怎么办?

java - 如何保留 lambda 的参数类型?

java - 是否可以在包含多种监听器类型的 Java 中创建我自己的事件监听器列表?

scala - Sqs Akka Stream 内存不足

scala - Scala 中具有迭代的丰富枚举

swift - 实现存储库模式时避免类型删除