0

我对我的原始代码做了一些简化,只是为了专注于这个问题。

我有这组课程:

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

现在我想在 As 列表中发现扩展 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 的对象相关联,那么这个问题可能会得到解决。有什么办法可以解决这个问题?

4

1 回答 1

4

您的代码有一些问题。

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

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

3)list match如果您的案例是 a B:list是 a没有意义List,所以它永远不可能是 a 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)
}
于 2012-04-25T16:13:36.047 回答