可以在scala中匹配特征层次结构吗?

时间:2015-09-26 22:41:01

标签: scala

可以匹配特征层次结构而不是类的工作吗? 性状可以匹配吗?

我是不是在编写提取器时不够,或者没有办法按特征而不是类来匹配,如下面的简化示例所示:

8-bit bytestring

让我想起一些结构性的打字。

1 个答案:

答案 0 :(得分:3)

object Compile {
  def foo(s: Abstract) = s match {
    case _ : A =>
    case _ : B =>
  }
}

所以它可以按类型匹配,包括类和特征:

object Compile {
  def foo(s: Abstract) = s match {
    case _ : A =>
    case _ : B =>
    case _ : C1 =>
  }
}

_这里只是一个占位符,您可以使用任何名称捕获对象本身。 请注意,它不能正确地用于结构类型,因为它总能成功匹配它们:

scala> object Compile {
     |       def foo(s: Abstract) = s match {
     |         case _ : A =>
     |         case _ : B =>
     |         case _ : C =>
     |         case _ : {def a: Int} => println("Z")
     |       }
     |     }
<console>:16: warning: a pattern match on a refinement type is unchecked
               case _ : {def a: Int} => println("Z")
                        ^

scala> Compile.foo(new Abstract{})
Z