这是我的容器类型。
trait Container[Repr] { self: Repr =>
def doSomething(): Repr
}
case class IntContainer(value: Int) extends Container[IntContainer] {
override def doSomething(): IntContainer = IntContainer(value + 1)
}
// IntContainer correctly returns self type
val res: IntContainer = IntContainer(10).doSomething()
这些是我对上述容器类型列表的暗示。
object Implicits {
implicit class GenTraversableLikeMonadOps[C <: Container[C], T](containers: GenTraversableLike[C, T]) {
def doAllTheThings[That]()(implicit bf: CanBuildFrom[T, C, That]): That =
containers.map(_.doSomething())
}
implicit class ArrayMonadOps[C <: Container[C]](containers: Array[C]) extends GenTraversableLikeMonadOps(containers)
}
Seq
,SeqView
和Array
都返回容器自我类型和列表自我类型。
import Implicits._
val seq: Seq[IntContainer] = Seq(IntContainer(0)).doAllTheThings()
val seqView: SeqView[IntContainer,_] = Seq(IntContainer(0)).view.doAllTheThings()
val array: Array[IntContainer] = Array(IntContainer(0)).doAllTheThings()
迭代器没有扩展GenTraversableLike
import Implicits._
val iter: Iterator[IntContainer] = Seq(IntContainer(0)).iterator.doAllTheThings() // Cannot resolve symbol doAllTheThings
我是否可以这样做,doAllTheThings()
返回源列表的自我类型而不重复所有GenTraversableLikeMonadOps
来处理Iterator
案例?