当在列表上调用时,我们想要一个列表,在序列上返回一个 Seq。
implicit class SeqWithMyFilter[+T](seq: Seq[T]) {
def myFilter(pred: T => Boolean): Seq[T] = seq.filter(pred)
}
scala> List("x").myFilter(_=="x")
res1: Seq[String] = List(x)
但是添加类型不会编译:
implicit class SeqWithMyFilter[+T, +U <: Seq[T]](seq: U) {
def myFilter(pred: T => Boolean): U = seq.filter(pred)
}
。由于 seq.filter(pred) 总是返回一个 seq...
您要做的是使用SeqLike
,以便:
implicit class SeqWithMyFilter[A, Repr <: SeqLike[A, Repr]](seq: Repr){
def myFilter(pred: A => Boolean): Repr = seq filter pred
}
因为filter
的定义是根据实现类定义的:
abstract def filter(pred: T => Boolean): Repr
看看TraversableLike。您会发现List
,Seq
和许多(不是全部)继承或混合Traversable
的继承或混合都是在SeqLike
方面实现的。