我猜测出于兼容性原因,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/