我正在寻找创建Google Guava中的转发集合的最佳实践:
例如,Scala中的ForwardingList如下所示:
trait ForwardingList[T]
{
def delegate: List
}
但是,我不清楚此列表应扩展哪些特征,并且由于许多候选对象而必须覆盖哪些方法
List[T]
ListLike[T, ForwardingList[T]]
ListLike[T, List[T]]
最佳答案
您想使用Proxy
,它只需要定义val self: <Collection>
。但是请小心,因为这些Proxy
类返回该代理的集合,即SeqProxy
返回Seq
,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
一样使用,并在所有函数上返回MySeqLikeClass[T]
,而不是像Seq[T]
那样返回SeqProxy[T]
。