我正在实现一个非常简单的建造者模式,用于类似地图的容器:
当在“new MyContainer()”上使用上述“+=”或“build”方法时,结果在两种情况下都是类型为KeyValueContainer [String,Double]的。我很确定过去某个地方曾经提到过可以以某种方式使其返回实际的MyContainer子类型。您会使用方法返回类型协变来实现这一点(类似于Java),还是在您看来有更安全/更好的解决方案?谢谢!
trait KeyValueContainer[K,V] {
private var props: Map[K, V] = new HashMap[K, V]
private var built = false
/**
* Adds a key/value pair
*/
def +=(key: K, value: V): KeyValueContainer[K,V] = {
if (built)
throw new BuilderException
props = props + (key -> value)
this
}
def build = {
built = true
this
}
}
class MyContainer extends KeyValueContainer[String, Double]
当在“new MyContainer()”上使用上述“+=”或“build”方法时,结果在两种情况下都是类型为KeyValueContainer [String,Double]的。我很确定过去某个地方曾经提到过可以以某种方式使其返回实际的MyContainer子类型。您会使用方法返回类型协变来实现这一点(类似于Java),还是在您看来有更安全/更好的解决方案?谢谢!
CanBuildFrom
的地方相比,关键区别在于,在这种情况下,结果类型应始终与原始集合相同。 - Régis Jean-Gilles