2013-02-04 101 views
6

我希望能夠引用一個列表,其中包含子類型並從該列表中提取元素,並將它們隱式轉換。舉例如下:Scala列表和子類型

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 }