【问题标题】:Pattern matching on generic abstract type in scalascala中泛型抽象类型的模式匹配
【发布时间】:2016-09-04 14:39:15
【问题描述】:

我有一个自递归类型:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您想要子类型匹配,请使用 &lt;:&lt; 而不是 =:=

    【讨论】:

    • 似乎有点吵。如果我还必须在同一个块中对完全不同的类进行模式匹配怎么办?
    • 如果您需要匹配通过擦除消除的类型,我认为没有更简洁的解决方案,但我很乐意听到。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2013-12-21
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多