7

サブタイプを含むリストを参照し、そのリストから要素を取得して暗黙的にキャストできるようにしたいと考えています。例は次のとおりです。

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いますが、型を使ったよりエレガントな方法があることを望んでいました。前もって感謝します。

4

2 に答える 2

10

最良の方法は、パターン マッチングを使用することです。封印された特性を使用しているため、一致は徹底的になります。

x(0) match { 
  case Employee(id, name) => ...
  case Student(id, name, age) => ...
}
于 2013-02-04T06:23:58.653 に答える
8

ええと、従業員が必要な場合は、いつでも次のように使用できますcollect

val employees = x collect { case employee: Employee => employee }
于 2013-02-04T06:26:11.457 に答える