更改 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
其中 instances
是 JobsHistory
类型。问题是我调用了一个来自 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 一个新集,无论它是否可变。
有 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
其中 instances
是 JobsHistory
类型。问题是我调用了一个来自 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 一个新集,无论它是否可变。