我是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
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用方法"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]]
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我使用这个扩展并执行时:
collection.onlyInstancesOf[D].size must be === 2
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,.size返回4而不是2.此外,我检查,结果实际上包含C1和C2虽然它不应该.
当我做:
collection.onlyInstancesOf[D].foreach(e => …Run Code Online (Sandbox Code Playgroud)