我对原始代码进行了一些简化,只关注问题。
我有这组课程:
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的对象,那么这个问题肯定会解决。有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
您的代码存在一些问题。
1)应使用参数列表声明案例类:case class C()
2)要实例化C
,您需要编写C()
。 List(C)
是List[C.type]
但List(C())
是List[C]
,这就是您想要的。
3)list match
如果你的案例是B
则没有意义:list
是List
,所以它永远不会是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)
}