可能重复:
Syntax sugar: _*
我编写了一个函数,它传递了一个格式字符串(对于String.format(...))和一个varargs参数数组(以及其他内容)。该方法如下所示:
def myMethod(foo: Number, formatStr: String, params: Any*): Unit = {
// .. some stuff with foo
println(formatStr, params.map(_.asInstanceOf[AnyRef]) : _*)
}
我得到了params参数here的语法。有用!但是怎么样?我不理解println
的第二个参数的语法,特别是结尾部分(: _*
)。它显然是在调用map
并将数组扩展为AnyRef
s。
答案 0 :(得分:16)
通常,:
表示法用于类型归属,强制编译器将值视为某种特定类型。这与完全相同与投射相同。
val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double
在这种情况下,您将归因于特殊的 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 : _*)
答案 1 :(得分:7)
结尾部分: _*
将集合转换为vararg参数。
我知道这看起来很奇怪。