Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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:采用Seq或varargs的构造函数_Scala_Types_Constructor_Variadic Functions - Fatal编程技术网

Scala:采用Seq或varargs的构造函数

Scala:采用Seq或varargs的构造函数,scala,types,constructor,variadic-functions,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) } 此代码不编译,但给出警告: 双重定义: 构造函数Api:(Api_url

我猜,出于兼容性原因,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)
}
此代码不编译,但给出警告:

双重定义: 构造函数Api:(Api_url:String,params:(String,String)*)Api和构造函数Api:(Api_url:String,params: 第13行的Seq[(String,String)]Api在擦除后具有相同的类型: (api_url:java.lang.String,参数:Seq)api


那么我如何定义一个使用varargs或序列的构造函数呢?

否:实际上,
Any*
实际上几乎与
Seq[Any]
相同,而不是
Array[Any]

要消除两者之间的歧义,可以使用该技术添加一个伪隐式参数以使签名不同:

class Api(api_url: String, params: Seq[(String, String)]) {
  def this(api_url: String, params: (String, String)*)(implicit d: DummyImplicit) =
    this(api_url, params)
}

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

给定

你可以这样称呼它

new Api("url", ("a", "b"), ("c", "d"))

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


您可能想要使用的是toSeq,它返回它所使用的集合,并将其转换为Seq(如果它已经是Seq,则返回其本身)。但是,由于varargs参数已经被键入为Seq,因此无论如何,这是一个不可操作的选项。

我认为您希望使方法调用更美观,因此使用
.*
显式调用不是一个选项。在这种情况下,可以使用方法重载来解决问题

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

…这不是…真的很恶心吗?好吧,请随意提供一个不那么“恶心”的解决方案!当我想出来的时候,我会的。现在,我只需要抓取
varargs
构造函数^^为什么不保留varargs构造函数,让调用者做
seq:.*
他想做的事情呢?设计新的接口应该更喜欢
vargargs
而不是
seq
?我可以指出类型注释
:.*
是使用序列参数调用构造函数与varargs兼容的真正原因吗构造器。更多细节:就我而言,这是最好的解决方案。它允许您执行
Api(“url”)
Api(“url”,“a”->“b”)
Api(“url”,Seq(“a”->“b”)
,而不牺牲
的可读性:
val seq = Seq(("a", "b"), ("c", "d"))
new Api("url", seq:_*)
class Api(api_url: String, params: Seq[(String, String)]) {
  def this(api_url: String, param : (String, String), params: (String, String)*)
    = this(api_url, param +: params)
  def this(api_url: String)
    = this(api_url, Seq())
}