我是 scala 的新手,遇到了以下问题:
我想获取仅包含特定类型元素的现有集合的子集合。以下作品:
class C(val name : String)
class D(name : String) extends C(name) { }
val collection = Set[C](new C("C1"),new D("D1"),new C("C2"),new D("D2"))
collection.collect{case d : D => d}.size must be === 2 // works
但是,当我尝试使用“onlyInstancesOf[Type]”方法扩展集合类时,这不起作用。首先我的实现:
object Collection {
implicit def extendScalaCollection[E](coll : Traversable[E]) = new CollectionExtension[E](coll)
}
class CollectionExtension[E](coll : Traversable[E]) {
def onlyInstancesOf[SpecialE <: E] : Traversable[SpecialE] = {
coll.collect({case special : SpecialE => special}).asInstanceOf[Traversable[SpecialE]]
}
}
所以当我使用这个扩展并执行时:
collection.onlyInstancesOf[D].size must be === 2
我收到一个错误,.size 返回 4 而不是 2。此外,我检查过,结果实际上包含 C1 和 C2,尽管它不应该。
当我做:
collection.onlyInstancesOf[D].foreach(e => println(e.name))
我得到了例外:
java.lang.ClassCastException: CollectionsSpec$$anonfun$1$C$1 cannot be cast to CollectionsSpec$$anonfun$1$D$1
所以很明显,结果集仍然包含应该被过滤掉的元素。
我不明白为什么会发生这种情况,有人可以解释一下吗?
编辑:Scala:Scala 代码运行器版本 2.8.0.final