scala中通用抽象类型的模式匹配
Pattern matching on generic abstract type in 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 中编译吗?
我看过 class/type 标签,但我不确定它们是否可以用于这种情况。
你确实可以使用类型标签,但你需要一个具体的类型来从中获取类型标签。您可以将解决方案类型添加为类型参数:
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"
}
}
如果您想要子类型匹配,请使用 <:<
而不是 =:=
。
我有一个自递归类型:
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 中编译吗?
我看过 class/type 标签,但我不确定它们是否可以用于这种情况。
你确实可以使用类型标签,但你需要一个具体的类型来从中获取类型标签。您可以将解决方案类型添加为类型参数:
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"
}
}
如果您想要子类型匹配,请使用 <:<
而不是 =:=
。