在抽象类中使用模式匹配来调用依赖于类型的方法

时间:2012-04-25 16:04:42

标签: scala pattern-matching abstract-class

我对原始代码进行了一些简化,只关注问题。

我有这组课程:

abstract class A(n: String){
   def name = n
}

abstract class B[T](n: String) extends A(n){
   def printT(t: T) = println(t)
}

object B{
   def unapply[T](b: B[T]) = Some(b.name)
}

case class C extends B[Int]("integer")

现在我想在List of A上发现什么扩展B然后使用printT。像这样:

val list = List(C)

list match{
   case b @ B(_) => b.printT(2) 
}

我在case b @ B(_) => b.printT(2)行:

found   : Int(2)
required: T where type T
case b @ B(_) => b.printT(2)
                              ^

如果我可以将T关联到我想要使用类的T的对象,那么这个问题肯定会解决。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

您的代码存在一些问题。

1)应使用参数列表声明案例类:case class C()

2)要实例化C,您需要编写C()List(C)List[C.type]List(C())List[C],这就是您想要的。

3)list match如果你的案例是B则没有意义:listList,所以它永远不会B。也许你的意思是list foreach,它会对列表中的每个元素进行匹配吗?

以下是代码的更正版本,可按预期打印2

case class C() extends B[Int]("integer")

val list = List(C())

list foreach {
  case b @ B(_) => b.printT(2)
}

此外,b @ B(_)语法对我来说有点奇怪,因为如果你不打算使用它的部分,那么提取B是没有意义的。相反,您可以匹配类型:

list foreach {
  case b: B[Int] => b.printT(2)
}