更改 return 超类方法的类型

change return type of the superclass method

有 scala class

class JobsHistory extends mutable.HashSet[JobInstance] {

      /**
       * Filter only Map Reduce Jobs
       * @return
       */
      implicit def onlyMapReduce = this.filter((job) => job.mapTasksCount > 0 && job.reduceTasksCount > 0)

      /**
       * Filter only jobs with successful status
       * @return
       */
      implicit def onlySucceeded = this.filter((job) => job.status == "SUCCEEDED")
    }

我希望能够拨打电话

instances.onlyMapReduce.onlySucceeded

其中 instancesJobsHistory 类型。问题是我调用了一个来自 superclass 和 returns HashSet 而不是 JobsHistory 的过滤器,我如何确保正确的 return 类型。

我认为这是一个比继承更喜欢组合的好例子。

case class JobHistory(jobs: Set[JobInstance]) {
  def onlyMapReduce = copy(jobs = jobs filter (job => 
    job.mapTasksCount > 0 && job.reduceTasksCount > 0
  ))

  def onlySucceeded = copy(jobs = jobs filter (job => job.status == "SUCCEEDED"))
}

请注意,我已将 mutable.HashSet 替换为 immutable.Set

我建议使用 Pimp My Library 模式将这些方法添加到 Set

case class JobInstance(status: String, mapTasksCount: Int, reduceTasksCount: Int)

implicit class JobHistory(val jobs: Set[JobInstance]) extends AnyVal {
  def onlyMapReduce = jobs.filter((job) => job.mapTasksCount > 0 && job.reduceTasksCount > 0)

  def onlySucceeded = jobs.filter(_.status == "SUCCEEDED")
}

val set = Set(JobInstance("SUCCEEDED", 3, 3), JobInstance("SUCCEEDED", 0, 3), JobInstance("Failed", 3, 3))

set.onlyMapReduce.onlySucceeded
res3: scala.collection.immutable.Set[JobInstance] = Set(JobInstance(SUCCEEDED,3,3))

它与可变集的工作方式相同,因为 filter returns 一个新集,无论它是否可变。