Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的一个简单构建器模式_Scala_Builder_Covariance - Fatal编程技术网

Scala中的一个简单构建器模式

Scala中的一个简单构建器模式,scala,builder,covariance,Scala,Builder,Covariance,我正在为类似于地图的容器实现一个非常简单的构建器模式: 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)

我正在为类似于地图的容器实现一个非常简单的构建器模式:

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风格),还是您认为有一个更安全/更好的解决方案

谢谢

这里是:

模式依赖于编译时如何解析隐式。基本上,如果作用域中有多个隐式,编译器会选择最具体的一个(在您的例子中,是您需要的子类型生成器)

通过这种方式,您可以在基类中执行泛型实现,并通过隐式参数获得子类生成器

以下是我为自己的一个项目所做的一个示例:

此模式的另一个重要方面是显式自键入:
我推荐这篇文章,它简单得多,切中要害:

查看如何使用此.type返回您自己,并在此基础上进行构建

trait PaginationParameters extends Parameters {
 var _pageSize: Option[Int] = None
 var _page: Option[Int] = None

 def pageSize(newPageSize: Int): this.type = {
  _pageSize = Some(newPageSize); this
 }

 def page(newPage: Int): this.type  = {
  _page = Some(newPage); this
 }

 override def parameters = super.parameters ++
        _pageSize.map("page-size" -> _) ++
        _page.map("page" -> _)
 }
}

干杯

这里不需要这么复杂的建筑。或者换句话说,在这种情况下不需要隐式。F-有界多态性就可以了。关键区别(与标准库中使用
CanBuildFrom
的地方相比)是,在这种情况下,结果类型应该始终与原始集合相同+1用于链接到的所有额外阅读材料。谢谢哦,是的,你是对的。我想现在学习它不会有什么坏处,不过如果他想走这条路,他可能(在某个时候)会使用像map之类的转换。Nikolaos>我很高兴你从中得到了一些有用的东西:)你能为不变的数据结构做些什么吗?