我有一个元素列表,希望按类分组,然后处理结果。
trait H
case class A(x: Int) extends H
case class B(x: Int) extends H
val x = List(A(1),B(2),B(3))
val y = x.groupBy(_.getClass)
y.map(_ match {case (A, alist) => println("found me some As")
case (B, blist) => println("not As")})
不幸的是,这会产生如下错误:
<console>:17: error: pattern type is incompatible with expected type;
found : A.type
required: Class[_ <: Product]
Note: if you intended to match against the class, try `case _: A`
y.map(_ match {case (A, alist) => println("found me some As")
也就是说,当匹配的项目是类而不仅仅是一个实例时,我似乎无法找到正确匹配大小写的方法。< / p>
部分解决方案如下:
val z = y.map(_ match {case (atype, alist) => alist })
z.map(_ match {
case alist if alist.head.isInstanceOf[A] => alist
case blist => List()
})
但感觉应该有更好的方法来使用从Map
返回的初始groupBy
的键。
答案 0 :(得分:4)
A
中的 case (A, alist)
引用A
的伴随对象,其类型为A.type
。这就是你收到错误信息的原因。如果要与类元数据匹配,则应参考classOf[A]
。也没有理由使用match
,因为您已经可以与map
进行模式匹配。
y.map {
case (c, alist) if(c == classOf[A]) => println("found me some As")
case (c, blist) if(c == classOf[B]) => println("not As")
}