返回列表self类型的Seq,Array和Iterator的隐式列表操作

时间:2016-03-04 17:15:22

标签: scala

这是我的容器类型。

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)

}

SeqSeqViewArray都返回容器自我类型和列表自我类型。

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案例?

0 个答案:

没有答案