2013-02-04 28 views
6

Tôi muốn có thể tham khảo danh sách chứa các loại phụ và kéo các phần tử từ danh sách đó và đưa chúng vào một cách ngầm định. Ví dụ sau:Danh sách và loại phụ 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 
       ^

Tôi biết rằng x(0).asInstanceOf[Employee].name nhưng tôi hy vọng có cách thanh lịch hơn với các loại. Cảm ơn trước.

+3

Trong trường hợp này bạn cũng có thể chỉ cần thêm 'name' lĩnh vực để tính trạng. – drexin

Trả lời

10

Cách tốt nhất là sử dụng đối sánh mẫu. Bởi vì bạn đang sử dụng một đặc điểm niêm phong, trận đấu sẽ đầy đủ.

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

Vâng, nếu bạn muốn các nhân viên, bạn có thể luôn luôn sử dụng một collect:

val employees = x collect { case employee: Employee => employee } 
Các vấn đề liên quan