Scala:在模式匹配中使用超类型运算符

时间:2013-12-05 15:17:29

标签: scala design-patterns types

我制作了自己的特征和类框架,扩展了我的特质。所有类的父级都是名为“合同”的特征。 “Combinator”和“ElementaryContract”是合同的两个直接子女。

def disintegrateContract[T](element: T): Elem = 
{

    element match
    {
      case com <: Combinator =>  matchCombinator(com)
      case e <:ElementaryContract =>matchElementaryContract(e)
    }
}

我想创建一个匹配类来识别传递的'Contract'是'Combinator'或'ElementaryContract'的子类型,然后将其传递给其他一些函数。 这是我得到的编译错误:

 '=>' expected but '<:' found

可能它无法识别子类型运算符。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

如果理解正确,通常的模式匹配应该没问题 - 如果Bar扩展Foo,它是Foo (加上别的东西):

class SuperA
class ImplA extends SuperA

class SuperB
class ImplB extends SuperB

def disintegrateContract[T](element: T) = element match {
   case a: SuperA =>  println("I'm ancestor of Super A")
   case b: SuperB =>  println("I'm ancestor of Super B")
}

disintegrateContract(new ImplA)
// I'm ancestor of Super A
disintegrateContract(new ImplB)
// I'm ancestor of Super B

为了确定你的情况应该有超级SuperA和SuperB将扩展,但它没有任何改变。