им нового в Скале и побежал в следующую проблему:фильтр коллекции 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
Так, очевидно, полученный набор по-прежнему содержит элементы, которые должны были отфильтрованы.
Я не понимаю, почему это происходит, может ли кто-нибудь объяснить это?
Edit: Scala: Scala код бегуна версия 2.8.0.final
Не генерирует ли этот код предупреждение? – mkneissl
Вы правы, но, как оказалось, предупреждение не показывалось во время тестирования, потому что файл был скомпилирован некоторое время назад и не был перекомпилирован:/ – Ragmaanir
Возможный дубликат [Тип коллекции Scala для фильтра] (http: // stackoverflow. ком/вопросы/2218558/Scala-коллекция-типа для-фильтра) – thSoft