Ho una collezione Scala che contiene oggetti di sottotipi diversi.In Scala come faccio a filtrare per tipi reificati in fase di esecuzione?
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)
mi piacerebbe per filtrare tutti gli oggetti o gli A
B
oggetti. Posso farlo facilmente se conosco l'oggetto su cui voglio filtrare in fase di compilazione.
s.filter(_.isInstanceOf[A]) // Give me all the As
s.filter(_.isInstanceOf[B]) // Give me all the Bs
Posso farlo se conosco solo il tipo di oggetto da filtrare in fase di esecuzione? Voglio scrivere una funzione come questa.
def filterType(xs:List[Base], t) = xs.filter(_.isInstanceOf[t])
Dove t
indica se voglio oggetti di tipo A
o B
.
Ovviamente non riesco a scriverlo in questo modo a causa della cancellazione dei tipi. C'è un modo idiomatico di Scala per aggirare questo usando i tag tipo? Ho letto la documentazione dei tag di tipo Scala e i relativi post StackOverflow, ma non riesco a capirlo.
Un upvote per te, perché non mi rendevo conto che 'match' poteva sfruttare il' ClassTag', e questa è davvero la chiave qui. – wingedsubmariner