在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
,只需滚动我自己的构造函数(它会起作用,但它看起来不太好,需要思考和测试!)或者是否存在非泛型的工厂我不知道的是什么?
答案 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.scala,GenericCompanion.scala和GenSetFactory.scala中,只有很少的代码和实际为您实现的构造函数。
比ImmutableSetFactory
更好的起点可能是The Architecture of Scala Collections。 RNA链示例是非泛型Seq
,因此虽然它不是Set
,但它表明集合库能够用于非泛型集合。