【发布时间】:2014-05-03 00:22:21
【问题描述】:
我有一个包含不同子类型对象的 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 type-erasure