让我们说我有一个特点:
trait MyTrait[T, U <: SomeParentClass] {
def get(data: T): Option[U]
}
和具体实现如:
case class MyStringClass[U <: SomeParentClass](f: String => Option[U])
extends MyTrait[String, U] {
override def get(data: String) = f(data)
}
为简化起见,我们还说U <: SomeParentClass
有以下类型:
TypeA
TypeB
TypeC
和一些功能:
def str2TypeA(s: String): Option[TypeA] = ...
def str2TypeB(s: String): Option[TypeB] = ...
def str2TypeC(s: String): Option[TypeC] = ...
然后让我说:
val mySeq = Seq(
MyStringClass(str2TypeA),
MyStringClass(str2TypeB),
MyStringClass(str2TypeC)
)
我想要做的是根据返回类型mySeq
过滤U
。类似的东西:
mySeq.collect { case a: Function1[_, Option[TypeA]] => a}
我遇到了预期的类型擦除问题。我很好奇这些方法在这里可以很好地实现我的基于类型U
的过滤目标。
答案 0 :(得分:2)
您通常会使用TypeTag来处理擦除障碍的情况。它们本质上是简单的对象,包含编译时可用的所有信息,通过请求隐式参数或只写typeTag[T]
,它们很容易获得。例如:
import scala.reflect.runtime.universe._
case class MyStringClass[U <: SomeParentClass](f: String => Option[U])(implicit val utt: TypeTag[U])
extends MyTrait[String, U] {
override def get(data: String) = f(data)
}
mySeq.collect {
case a: MyStringClass[Option[TypeA]] if (a.utt == typeTag[Option[Type[A]]) => a
}