Scala非泛型集合

时间:2014-05-21 10:05:49

标签: scala scala-collections generic-collections

在Scala 2.10.2中,我正在创建一个类MultiLogger,它将继承自scala.sys.process.ProcessLogger,提供日志记录多路复用。

我对班级的想法看起来有点像这样:

class MultiLogger[T <: ProcessLogger]
(
    private val loggers : Set[T]
)
    extends Set[T]
    with scala.collection.SetLike[T,Set[T]]
    with scala.sys.ProcessLogger
{
...
}

它可能看起来像一组ProcessLogger个对象,因为它实际上就是它。

当我尝试定义提供NewBuilder的伴随对象时出现问题,例如:

object MultiLogger extends ImmutableSetFactory[MultiLogger]
{
    override def newBuilder[T]() : Builder[T, MultiLogger[T]] = new Builder[T, MultiLogger[T]]
    {
        var elems = Set[T]()
        def +=( t : T ) = { elems = elems + t; this } 
        def clear() { elems = elems.empty }
        def result() : MultiLogger[T] = new MultiLogger( elems ) // ERROR HERE
    }
}

然后抱怨T中的newBuilder不符合MultiLogger的类型要求,不出所料。

这是怎么回事?我根本不应该使用ImmutableSetFactory,只需滚动我自己的构造函数(它会起作用,但它看起来不太好,需要思考和测试!)或者是否存在非泛型的工厂我不知道的是什么?

1 个答案:

答案 0 :(得分:0)

ImmutableSetFactory实际上仅适用于通用集合,正如其包(scala.collection.generic)所示,并在其类型中看到:

abstract class ImmutableSetFactory[CC[X] <: immutable.Set[X]
                                            with SetLike[X, CC[X]]]
  extends SetFactory[CC]

CC参数必须是通用的,而不仅仅是通用的限制,因为它必须接受任何类型X作为其参数。

但是,在短源文件ImmutableSetFactory.scalaGenericCompanion.scalaGenSetFactory.scala中,只有很少的代码和实际为您实现的构造函数。

ImmutableSetFactory更好的起点可能是The Architecture of Scala Collections。 RNA链示例是非泛型Seq,因此虽然它不是Set,但它表明集合库能够用于非泛型集合。