im nouveau à scala et a couru dans le problème suivant:filtre collection Scala par type
Je veux obtenir une sous-collection d'une collection existante qui ne contient que des éléments d'un type particulier. Les travaux suivants:
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
Mais lorsque je tente d'étendre les classes de collection avec une méthode « onlyInstancesOf [type] » cela ne fonctionne pas. Tout d'abord ma mise en œuvre:
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]]
}
}
Alors quand j'utiliser cette extension et Execute:
collection.onlyInstancesOf[D].size must be === 2
Je reçois une erreur qui .Size retourné 4 et non 2. En outre, j'ai vérifié, le résultat contient effectivement C1 et C2 bien que cela ne devrait pas.
Quand je fais:
collection.onlyInstancesOf[D].foreach(e => println(e.name))
je reçois l'exception:
java.lang.ClassCastException: CollectionsSpec$$anonfun$1$C$1 cannot be cast to CollectionsSpec$$anonfun$1$D$1
Alors, évidemment, l'ensemble contient encore obtenu les éléments qui auraient dû être filtrés.
Je ne comprends pas pourquoi cela arrive, quelqu'un peut-il expliquer cela?
Edit: Scala: Code Scala coureur Version 2.8.0.final
Ce code ne génère-t-il pas d'avertissement? – mkneissl
Vous avez raison, mais comme il s'est avéré que l'avertissement n'a pas été affiché pendant le test car le fichier a été compilé il y a quelque temps et n'a pas été recompilé:/ – Ragmaanir
duplication possible de [type de collection Scala pour filtre] (http: // stackoverflow. com/questions/2218558/scala-collection-type-pour-filtre) – thSoft