如何创建具有特定类型的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, 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])
有没有更好/更容易的方法来创建这样的包装,或者我错过了实现ѭ5的任何重要事项?
编辑:后续问题是:可以将整个包装逻辑放入ListWrapper
类或特征中,以便可以像这样实现上述MyList
:
class MyList extends ListWrapper[Int, MyList]
object MyList extends ListWrapperFactory[Int, MyList]
没有找到相关结果
已邀请:
2 个回复
稍惮
,这可能会更改集合类型。 您可能会在
中做什么:
这样可以确保静态类型的“ 5”上的“ 13”实际具有动态类型,而动态类型是“ 5”的子类型,它将重用相同的动态类型。 编辑:似乎缺少一些东西,为此
返回
而不是
的实例:
链接的文章中的“ 23”示例看起来也是如此。如果它具有静态类型
而不是
,则其上的
返回一个向量。 编辑2:看起来这是一个更普遍的问题,在此问题中进行了讨论。
断跑胺弄萎
现在可以通过以下方式实现“ 5”:
这绝对比在
的定义中包含所有样板代码好,但是要使
只是
的包装,仍然要写很多东西。