Mam kolekcję Scala, która zawiera obiekty różnych podtypów.W programie Scala, jak filtrować według typów reifikowanych w środowisku wykonawczym?
abstract class Base
class A extends Base
class B extends Base
val a1 = new A()
val a2 = new A()
val b = new B()
val s = List(a1, a2, b)
chciałabym odfiltrować wszystkie A
obiektów lub B
obiektów. Mogę to zrobić z łatwością, jeśli znam obiekt, który chcę filtrować podczas kompilacji.
s.filter(_.isInstanceOf[A]) // Give me all the As
s.filter(_.isInstanceOf[B]) // Give me all the Bs
Czy mogę to zrobić, jeśli tylko znać typ obiektu, aby filtrować w czasie wykonywania? Chcę napisać taką funkcję.
def filterType(xs:List[Base], t) = xs.filter(_.isInstanceOf[t])
Gdzie t
wskazuje, czy chcę obiektów typu A
lub B
.
Oczywiście nie mogę tak napisać w ten sposób z powodu usunięcia typu. Czy istnieje idiomatyczna metoda Scala do obejścia tego przy użyciu znaczników typu? Czytałem dokumentację znaczników typu Scala i odpowiednie posty StackOverflow, ale nie mogę tego zrozumieć.
Przeprowadzka dla ciebie, ponieważ nie zdawałem sobie sprawy, że 'match' może skorzystać z' ClassTag', i to naprawdę jest tutaj kluczowe. – wingedsubmariner