scala中泛型抽象类型的模式匹配



我有一个自递归类型:

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编译代码吗?

我见过类/类型标签,但我真的不确定它们是否能在这种情况下使用。

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

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"
  }
}

如果希望子类型匹配,请使用<:<而不是=:=

相关内容

  • 没有找到相关文章

最新更新