我正在寻找在 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
您想使用Proxy
which 需要您定义 just val self: <Collection>
。但是要小心,因为这些Proxy
类会返回该代理的集合,即SeqProxy
返回Seq
on 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]
完全像所有函数上的Seq
AND 返回一样使用,MySeqLikeClass[T]
而不是按Seq[T]
原样使用SeqProxy[T]
。