2013-02-04 2 views
6

Я хочу иметь возможность обратиться к списку, который содержит подтипы и вытягивать элементы из этого списка и нести их неявно. Пример следующим образом:Scala List и подтипы

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 }