模式匹配在scala中的通用抽象类型

时间:2016-05-09 20:11:03

标签: scala generics types type-erasure scala-generics

我有一个自我递归的类型:

trait Problem[P <: Problem[P]] {
  type Solution
}

现在,我想在P#Solution上进行模式匹配。我们假设我们在case class Foo[P <: Problem[P]]()

之内
case ExampleCaseClass(s: P#Solution) if conditionApplies() =>
  // do sth

case ExampleCaseClass(s: P#Solution) =>
  // now sth else

当然它因类型擦除而失败。有没有办法让代码在scala中编译?

我已经看过类/类型标签,但我不确定它们是否可以在这种情况下使用。

1 个答案:

答案 0 :(得分:2)

您确实可以使用类型标记,但需要具体类型才能从中获取类型标记。您可以将解决方案类型添加为类型参数:

case class Foo[P <: Problem[P], S <: P#Solution:TypeTag]() {
  def doSomething[T:TypeTag](c: ExampleCaseClass[T]) = c match {
    case ExampleCaseClass(s) if typeOf[T] =:= typeOf[S] => "x"
    case ExampleCaseClass(s) => "y"
  }
}

如果您想要匹配子类型,请使用<:<代替=:=