我正在寻找在 Google Guava中创建转发集合的最佳实践:例如,Scala 中的 ForwardingList 如下所示:
trait ForwardingList[T]
{
def delegate: List
}
但是,我不清楚该列表应该扩展哪些特征以及必须覆盖哪些方法,因为有很多候选者
List[T]ListLike[T, ForwardingList[T]]ListLike[T, List[T]]
我正在寻找在 Google Guava中创建转发集合的最佳实践:例如,Scala 中的 ForwardingList 如下所示:
trait ForwardingList[T]
{
def delegate: List
}
但是,我不清楚该列表应该扩展哪些特征以及必须覆盖哪些方法,因为有很多候选者
List[T]ListLike[T, ForwardingList[T]]ListLike[T, List[T]]您可以采取简单的路线并扩展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
您想使用Proxywhich 需要您定义 just val self: <Collection>。但是要小心,因为这些Proxy类会返回该代理的集合,即SeqProxy返回Seqon filter、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]完全像所有函数上的SeqAND 返回一样使用,MySeqLikeClass[T]而不是按Seq[T]原样使用SeqProxy[T]。