ich eine Eigenschaft haben, die wie folgt definiert ist:Scala Pattern Matching auf Allgemein Traits
sealed trait MyTrait[+A] {
def name: String
def id: Long
def someType: A
}
ich jetzt einige Fall Klassen, die diese Eigenschaft erstrecken, wie unten:
object MyTrait {
case class One[+A](name: String, id: Long, someField: String, someType: A) extends MyTrait[A]
case class Two[+A](name: String, id: Long, someField: String, someType: A) extends MyTrait[A]
case class Three[+A](name: String, id: Long, someType: A) extends MyTrait[A]
}
Nun, ich habe eine Liste, die eine dieser Fallklassen enthalten könnte und ich die Einzelfall-Klassen aus der gegebenen Liste zu sammeln, und ich verwende instanceOf prüft, wie unten:
val myBigList = List(One[SomeType], Two[SomeType], Three[SomeType], One[SomeType])
val allOnes = myBigList.collect {
case elem if elem.isInstanceOf[One[_]] => elem.asInstanceOf[One]]
}
val allTwos = myBigList.collect {
case elem if elem.isInstanceOf[Two[_]] => elem.asInstanceOf[Two]]
}
val allThrees = myBigList.collect {
case elem if elem.isInstanceOf[Three[_]] => elem.asInstanceOf[Three]]
}
Gibt es einen besseren Weg? Ich meine, gibt es eine Möglichkeit, die isInstanceOf und asInstanceOf zu vermeiden?
Wie in einem Arbeitsgang ? Ich brauche die individuellen Werte draußen! – sparkr
@sparkr ... editiert die Antwort mit Beispiel. Bitte guck dir das an – pamu