在Scala中,如何在运行时按照已知类型进行过滤?
发布时间:2020-12-16 09:58:03 所属栏目:安全 来源:网络整理
导读:我有一个包含不同子类型对象的 Scala集合. abstract class Baseclass A extends Baseclass B extends Baseval a1 = new A()val a2 = new A()val b = new B()val s = List(a1,a2,b) 我想过滤掉所有A对象或B对象.如果我知道在编译时要过滤的对象,我可以很容易
我有一个包含不同子类型对象的
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),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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |