【发布时间】:2011-08-05 07:37:42
【问题描述】:
我正在尝试创建具有特定类型(例如 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, Int, 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]
【问题讨论】:
标签: list scala scala-2.8 scala-collections