2013-02-04 7 views
6

サブタイプを含むリストを参照し、そのリストから要素を引き出し、それらを暗黙的にキャストする必要があります。例は次のとおりです。スカラリストとサブタイプ

scala> sealed trait Person { def id: String } 
defined trait Person 

scala> case class Employee(id: String, name: String) extends Person 
defined class Employee 

scala> case class Student(id: String, name: String, age: Int) extends Person 
defined class Student 

scala> val x: List[Person] = List(Employee("1", "Jon"), Student("2", "Jack", 23)) 
x: List[Person] = List(Employee(1,Jon), Student(2,Jack,23)) 

scala> x(0).name 
<console>:14: error: value name is not a member of Person 
       x(0).name 
       ^

は私がx(0).asInstanceOf[Employee].nameが、私はそこに期待していたが、種類とよりエレガントな方法だったことを知っています。前もって感謝します。

+3

この場合、あなたはまた、単に形質に 'name'のフィールドを追加することができます。 – drexin

答えて

10

パターンマッチングを使用することをお勧めします。あなたが密封された特性を使用しているので、マッチは網羅的です。

x(0) match { 
    case Employee(id, name) => ... 
    case Student(id, name, age) => ... 
} 
8

さてあなたは、従業員をしたい場合、あなたは常にcollectを使用することができます。

val employees = x collect { case employee: Employee => employee } 
関連する問題