加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用特定类型创建List的包装器

发布时间:2020-12-16 09:23:52 所属栏目:安全 来源:网络整理
导读:我正在尝试使用特定类型(例如List [Int])创建List的包装器,以便采用隐式CanBuildFrom参数的方法返回包装器的实例而不是List. 一种可能的解决方案,感觉相当重量级,是: import scala.collection._import generic.{CanBuildFrom,SeqForwarder}import mutable.{
我正在尝试使用特定类型(例如List [Int])创建List的包装器,以便采用隐式CanBuildFrom参数的方法返回包装器的实例而不是List.

一种可能的解决方案,感觉相当重量级,是:

import scala.collection._
import generic.{CanBuildFrom,SeqForwarder}
import mutable.{Builder,ListBuffer}

class MyList(list: List[Int]) extends immutable.LinearSeq[Int]
                                 with LinearSeqLike[Int,MyList]
                                 with SeqForwarder[Int] {
  override def newBuilder: Builder[Int,MyList] = MyList.newBuilder
  protected override def underlying = list
}

object MyList {
  def newBuilder: Builder[Int,MyList] =
    new ListBuffer[Int] mapResult(new MyList(_))

  implicit def canBuildFrom: CanBuildFrom[MyList,Int,MyList] = {
    new CanBuildFrom[MyList,MyList] {
      def apply(from: MyList) = from.newBuilder
      def apply() = newBuilder
    }
  }
}

val l1 = new MyList(List(1,2,3))

println(l1.isInstanceOf[MyList])
println(l1.map(_ + 1).isInstanceOf[MyList])
println(l1.filter(_ == 2).isInstanceOf[MyList])

是否有更好/更简单的方法来创建这样的包装器,还是我错过了MyList实现中的任何重要内容?

编辑:后续问题是:可以将整个包装逻辑放入ListWrapper类或特征中,以便上面的MyList可以像这样实现:

class MyList extends ListWrapper[Int,MyList]

object MyList extends ListWrapperFactory[Int,MyList]

解决方法

据我所知,阅读本文:

http://www.scala-lang.org/docu/files/collections-api/collections-impl.html

如果你想要过滤器/地图/等,你的解决方案是最简单的.到所有返回MyList的实例.像filter这样的ops需要newBuilder,而像map这样的ops的隐式CanBuildFrom可能会改变集合类型.

您在CanBuildFrom中应该做的是:

def apply(from: MyList) = from.newBuilder // call it on `from'

这确保了实际上具有作为MyList子类型的动态类型的静态类型MyList上的映射将重用相同的动态类型.

编辑:似乎有一些东西丢失,因为这个地图返回List的实例而不是MyList:

val l1: LinearSeq[Int] = new MyList(List(1,3))
println(l1.map(_ + 1)) // prints List(2,3,4)

看起来这也是从链接文章中获取的RNA示例的情况.如果它具有静态类型IndexedSeq [Base]而不是RNA,则其上的映射返回一个向量.

编辑2:看起来这是一个更普遍的问题,在this question中讨论过.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读