在特征上匹配类型参数

时间:2017-06-02 00:00:40

标签: scala

让我们说我有一个特点:

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的过滤目标。

1 个答案:

答案 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
}