如何使用特定类型创建List的包装器
我正在尝试使用特定类型(例如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中讨论过. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 必须覆盖scala中的val变量
- Angularjs setValidity导致modelValue不更新
- scala – “特质”与“模板特质”有什么区别?
- angularjs – 占位符与angular/bootstrap不工作
- angularjs – ng-checked不工作角度为复选框
- Lotus domino 8.5 WebService 二 (LotusScript消费WebServi
- 通过WebService调用SQLXML(SQL Server 2005)
- webservice 启用代理服务器
- AngularJs与jquery 差异的分析
- 使用Scala的Datastax Cassandra驱动程序