3

我正在寻找在 Google Guava中创建转发集合的最佳实践:例如,Scala 中的 ForwardingList 如下所示:

   trait ForwardingList[T] 
   {
      def delegate: List
   }

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

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

2 回答 2

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
于 2013-01-10T13:35:00.713 回答
1

您想使用Proxywhich 需要您定义 just val self: <Collection>。但是要小心,因为这些Proxy类会返回该代理的集合,即SeqProxy返回Seqon filtermap等。

这些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]完全像所有函数上的SeqAND 返回一样使用,MySeqLikeClass[T]而不是按Seq[T]原样使用SeqProxy[T]

于 2013-01-10T18:02:50.120 回答