什么:_*从Scala调用Java vararg方法时做什么?

Mat*_*rts 24 java scala

可能重复:Scala
:_*(冒号下划线明星)做了什么?

我正在使用REPL来调用带有Scala数组的Java vararg方法.

如果我这样做,我会收到错误:

case class Person(name: String, age: Int)
val array = Array(classOf[String], classOf[Int])
Person.getClass.getMethod("apply", array)
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,那么它的工作原理:

Person.getClass.getMethod("apply", array:_*)
Run Code Online (Sandbox Code Playgroud)

我的问题是:_*做什么的?它在Scala API中的定义在哪里?

Dan*_*mon 31

添加:_*告诉编译器将数组视为varargs.它与Scala和Java一样.如果我有方法

def foo(args: Int*) = args.map{_ + 1}
Run Code Online (Sandbox Code Playgroud)

我可以这样称呼它:

foo(1, 2, 3, 4) //returns ArrayBuffer(2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

但如果我想传递一个实际的序列(就像你一样getMethod),我会这样做:

val mylist = List(1, 2, 3, 4)
foo(mylist:_*)
Run Code Online (Sandbox Code Playgroud)