解释varargs的Scala语法

Ral*_*lph 2 syntax scala variadic-functions

可能重复:
语法糖:_*

我写了一个函数,它传递了一个格式字符串(对于String.format(...))和一个varargs参数数组(以及其他东西).该方法如下所示:

def myMethod(foo: Number, formatStr: String, params: Any*): Unit = {
  // .. some stuff with foo
  println(formatStr, params.map(_.asInstanceOf[AnyRef]) : _*)
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到了params参数的语法.有用!但是怎么样?我不理解第二个参数的语法println,尤其是结尾部分(: _*).显然,调用map并将数组扩展为AnyRefs 序列.

Kev*_*ght 16

通常,:表示法用于类型归属,强制编译器将值视为某种特定类型.这不是一样的铸件.

val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将归因于特殊的varargs类型_*.这反映了用于声明varargs参数的星号表示法,可用于子类的任何类型的变量Seq[T]:

def myMethod(params: Any*) = ... //varargs parameter, use as an Array[Any]

val list = Seq("a", 42, 3.14) //a Seq[Any]
myMethod(list : _*)
Run Code Online (Sandbox Code Playgroud)


小智 7

结束部分: _*将集合转换为vararg参数.

我知道,这看起来很奇怪.