【发布时间】:2018-02-18 03:59:17
【问题描述】:
考虑以下工作自定义Seq:
class MySeq[B](val s: Seq[B])
extends Seq[B]
with GenericTraversableTemplate[B, MySeq]
with SeqLike[B, MySeq[B]] {
override def companion = MySeq
def iterator = s.iterator
def apply(i: Int) = s(i)
def length = s.length
override def toString = s map { _.toString } mkString("\n")
}
object MySeq extends SeqFactory[MySeq] {
implicit def canBuildFrom[B]: CanBuildFrom[Coll, B, MySeq[B]] =
new GenericCanBuildFrom[B]
def newBuilder[B] = new ListBuffer[B] mapResult (x => new MySeq(x.toSeq))
}
我想对类型参数B 施加一个界限。换句话说,我想要这样的东西(不工作):
class MyA
class MySeq[+B <: MyA](val s: Seq[B])
extends Seq[B]
with GenericTraversableTemplate[B, MySeq]
with SeqLike[B, MySeq[B]] {
override def companion = MySeq // Type Mismatch Here
def iterator = s.iterator
def apply(i: Int) = s(i)
def length = s.length
override def toString = s map { _.toString } mkString("\n")
}
object MySeq extends SeqFactory[MySeq] {
implicit def canBuildFrom[B]: CanBuildFrom[Coll, B, MySeq[B]] =
new GenericCanBuildFrom[B]
// Type Mismatch in the line below
def newBuilder[B] = new ListBuffer[B] mapResult (x => new MySeq(x.toSeq))
}
但我在指示的行中收到以下类型不匹配错误:
inferred type arguments [B] do not conform to
class MySeq's type parameter bounds [+B <: MyA]
Main.scala line 49
type mismatch;
found : countvotes.structures.MySeq.type
required: scala.collection.generic.GenericCompanion[Seq]
Main.scala line 36
type mismatch;
found : MySeq[B(in class MySeq)]
required: MySeq[B(in method newBuilder)]
Main.scala line 49
type mismatch;
found : scala.collection.immutable.Seq[B(in method newBuilder)]
required: Seq[B(in class MySeq)]
Main.scala line 49
我尝试通过向 CanBuildFrom 和 newBuilder 的类型参数添加边界来解决此问题,但随后我收到其他错误消息。
如何创建自定义Seq,绑定类型参数?
【问题讨论】:
-
您扩展集合而不是将其封装在具有上限要求的包装类中的任何原因?
-
原因是它会更优雅。我会在这个类上大量使用
map和filter,每次手动解包重新打包会很不方便。
标签: scala collections types factory