Scala自我类型在模式匹配中

时间:2015-08-17 22:15:27

标签: scala pattern-matching self-type

鉴于我可以创建一个具有自我类型的特征并限制实现并允许访问这样的成员:

trait A { def a:String }
trait B { def b:String }

trait C {
   self: A with B =>
   lazy val c:String = a+b
}

为什么我不能将这个概念带入模式匹配中。我知道下面不起作用,但是它只是缺少一些语法糖还是有限制阻止了这个?

case class AB( a:String, b:String ) extends A with B
val ab = AB("a","b")

ab match {
  case ab@(A & B) => ab.a + ab.b
}

这些不太优雅的版本有什么用呢

ab match {
  case a:A => a match {
    case b:B => a.a + b.b
  }
}

def checkInstanceOf(obj:AnyRef) = 
  obj.isInstanceOf[A] && obj.isInstanceOf[B]
ab match {
  case ab if(checkInstanceOf(ab)) => ab.a + ab.b
}

我的目标是能够根据正在实施的两个或多个特征编写泛型类驱动行为。

1 个答案:

答案 0 :(得分:5)

类型A with B的正常类型检查有效:

ab match {
  case ab: A with B => ab.a + ab.b
}