Scala列表和子类型

时间:2013-02-04 06:05:53

标签: scala covariance

我希望能够引用包含子类型的列表,并从该列表中提取元素并隐式转换它们。示例如下:

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,但我希望有一种更优雅的方式。提前谢谢。

2 个答案:

答案 0 :(得分:10)

最好的方法是使用模式匹配。因为你使用的是密封特性,所以比赛将是详尽的,这很好。

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

答案 1 :(得分:8)

好吧,如果你想要员工,你可以随时使用collect

val employees = x collect { case employee: Employee => employee }