转发集合的最佳做法

时间:2013-01-10 12:04:02

标签: scala collections scala-collections

我正在寻找创建转发集合的最佳做法,例如Google Guava: 例如,Scala中的ForwardingList看起来像:

   trait ForwardingList[T] 
   {
      def delegate: List
   }

但是我不清楚这个列表应该扩展哪些特征以及哪些方法必须被覆盖,因为有很多候选者

  • List[T]
  • ListLike[T, ForwardingList[T]]
  • ListLike[T, List[T]]

2 个答案:

答案 0 :(得分:2)

您可以采用简单的路线并延伸SeqProxy

import collection.SeqProxy

class ForwardingList[T](val self: List[T]) extends SeqProxy[T]

val xs = List(2,3,5,7,11,13)
val fs = new ForwardingList(xs)

println(fs.size)    // 6
println(fs(0))      // 2
fs foreach println  // 2,...,13

答案 1 :(得分:1)

您想要使用Proxy,这需要您仅定义val self: <Collection>。但请注意,因为这些Proxy类会返回该代理的集合,即SeqProxy会在Seqfilter上返回map等。

ProxyLike类允许定义类型参数Repr,以进一步限制代理的返回类型。可以定义:

class MySeqLikeClass[T] extends Seq[T] with SeqProxyLike[T, MySeqLikeClass[T]] {
  protected[this] def newBuilder: mutable.Builder[T, MySeqLikeClass[T]] = ???
  def seq: Seq[T] = ???
  def self: MySeqLikeClass[T] = ???
}

仅填写上述方法,MySeqLikeClass[T]的使用方式与Seq完全相同,并在所有功能上返回MySeqLikeClass[T],而不是Seq[T]SeqProxy[T]会。