【问题标题】:Best practices for forwarding collections转发集合的最佳实践
【发布时间】:2013-01-10 12:04:01
【问题描述】:

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

   trait ForwardingList[T] 
   {
      def delegate: List
   }

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

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

【问题讨论】:

    标签: scala collections scala-collections


    【解决方案1】:

    您可以采取简单的方法并扩展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
    

    【讨论】:

    • 这并没有真正完全回答问题,只是给出了一种转发到集合Seq的示例
    【解决方案2】:

    您想使用Proxy,这要求您只定义val self: <Collection>。但是要小心,因为这些Proxy 类返回该代理的集合,即SeqProxyfiltermap 等上返回Seq

    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] 那样。

    【讨论】:

    • 这是否会转发所有方法,即使我使用它来创建转发列表?我只能对 SeqLike 中定义的方法进行成像。
    • 是的,但是List 中只有 4 个方法 SeqProxyLike 没有涵盖,:::::reverse_:::mapConserve
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2010-09-18
    • 2016-09-03
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多