小编Rag*_*nir的帖子

Scala集合按类型过滤

我是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)

types scala filter type-erasure scala-collections

4
推荐指数
2
解决办法
2918
查看次数

标签 统计

filter ×1

scala ×1

scala-collections ×1

type-erasure ×1

types ×1