私は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 が 2 ではなく 4 を返したというエラーが表示されます。
私がする時:
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