如何为scala集指定newBuilder?

时间:2013-04-17 01:34:12

标签: scala builder scala-collections

我正在尝试在Scala中扩展一组整数。基于earlier answer我决定使用SetProxy对象。我现在正在尝试实现{em> Programming in Scala 第二版第25章所述的newBuilder机制,但遇到了麻烦。具体来说,我无法弄清楚要为SetBuilder对象指定的参数。这是我尝试过的。

package example

import scala.collection.immutable.{HashSet, SetProxy}
import scala.collection.mutable

case class CustomSet(override val self: Set[Int]) extends SetProxy[Int] {
  override def newBuilder[Int, CustomSet] = 
    new mutable.SetBuilder[Int, CustomSet](CustomSet())
}

object CustomSet {
  def apply(values: Int*): CustomSet = CustomSet(HashSet(values.toSeq: _*))
}

这不编译。这是错误。

scala: type mismatch;
 found   : example.CustomSet
 required: CustomSet
  override def newBuilder[Int, CustomSet] = new mutable.SetBuilder[Int, CustomSet](CustomSet())
                                                                                        ^

这对我来说很神秘。我已经尝试了有问题的价值的各种变化,但没有一个工作。我如何进行编译?

除了 Scala中的编程之外,我查看了各种StackOverflow帖子,如this one,但仍然感到神秘。

1 个答案:

答案 0 :(得分:1)

试一试:

case class CustomSet(override val self: Set[Int]) extends SetProxy[Int] {
  override def newBuilder = new mutable.SetBuilder[Int, Set[Int]](CustomSet())
}

object CustomSet {
  def apply(values: Int*): CustomSet = CustomSet(HashSet(values.toSeq: _*))
}

创建SetBuilder时,将CustomSet指定为第二个类型参数不满足该参数的类型。将其切换为Set[Int]符合该条件,并允许您仍然传递CustomSet作为构造函数arg。希望这会有所帮助。