如何在Scala中将自定义方法添加到自定义IndexedSeq?

时间:2016-02-07 03:05:17

标签: scala scala-collections

作为一个简化的例子,假设我想设置一个专门用于使用整数的IndexedSeq,如下所示:

class IntSeq private(val ints: Seq[Int], val length: Int) extends IndexedSeq[Int]{
  def apply(idx: Int): Int = {
    if(idx < 0 || idx >= length) throw new IndexOutOfBoundsException
    ints(idx)
  }
}

object IntSeq {
   def fromSeq(seq: Seq[Int]): IntSeq = new IntSeq(seq, seq.length)

   def apply(ints: Int*): IntSeq = fromSeq(ints)
}

从表面上看,这段代码似乎在以下意义上起作用:

val intSeq = IntSeq(1, 2)
intSeq(1) // correctly returns the 2

但是,如果我然后尝试使用:

扩展此IntSeq
intSeq + 3 

我会收到以下错误:

type mismatch;
 found   : Int(3)
 required: String

我可以看到这是因为+方法实际上来自Predef对象,这可能不是我预期的。

IntSeq缺少什么才能使用Builder功能? 我是否需要添加/定义构建器? 我该怎么做?

1 个答案:

答案 0 :(得分:2)

这是因为一般不可变的IndexedSeq或Seq没有+方法。它只有:++:,因为您可以追加并添加到Seq。