scala - Scala:构造函数采用Seq或varargs

标签 scala types constructor variadic-functions

我猜测出于兼容性原因,vararg参数Any*的类型为Array [Any]-如果我错了,请更正此错误。但是,这不能解释以下错误:

class Api(api_url: String, params: Seq[(String, String)]) {
  def this(api_url: String, params: (String, String)*)
    = this(api_url, params.seq)
}

该代码不会编译,但会给出警告:

double definition: constructor Api:(api_url: String, params: (String, String)*)Api and constructor Api:(api_url: String, params: Seq[(String, String)])Api at line 13 have same type after erasure: (api_url: java.lang.String, params: Seq)Api



那么,如何定义采用可变参数或序列的构造函数?

最佳答案

采用varargs的方法也总是采用序列,因此不需要定义辅助构造函数或重载方法。

给定

class Api(api_url: String, params: (String, String)*)

你可以这样称呼它
new Api("url", ("a", "b"), ("c", "d"))

要么
val seq = Seq(("a", "b"), ("c", "d"))
new Api("url", seq:_*)

另外,在您的问题中,您正在对params参数调用seq方法。这可能不符合您的预期。 seq用于确保对结果集合的操作按顺序执行,而不是并行执行。该方法是在Scala 2.9.0版的并行集合中引入的。

您可能想使用的是toSeq,它将返回用于转换为Seq的集合(如果已经是Seq,则返回其本身)。但是由于varargs参数已经输入为Seq,因此无论如何都不能操作。

关于scala - Scala:构造函数采用Seq或varargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040382/

相关文章:

haskell - 在 haskell 中使用 cheapskate 无法识别类型别名

javascript - 如果已经有类了,为什么我应该使用接口(interface)作为 Angular 中的数据类型?

constructor - Go 结构构造函数中具有默认值的可选参数

linux - 如何从命令行检查 Spark 配置?

Haskell 歧义类型

java - 为什么主构造函数主体在字段初始化之前执行?

c++ - 检测堆栈或堆分配

scala - Scala 中的 += 运算符

scala - Spark独立模式: How to compress spark output written to HDFS

scala - 在Scala中创建类型的新实例