一尘不染

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

java

我正在使用REPL用Scala数组调用Java vararg方法。

如果执行此操作,则会出现错误:

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

但是,如果我这样做,那就行得通:

Person.getClass.getMethod("apply", array:_*)

我的问题是怎么:_*办?Scala API在哪里定义?


阅读 209

收藏
2020-12-03

共1个答案

一尘不染

添加:_*告诉编译器将数组视为varargs。Scala与Java的工作原理相同。如果我有方法

def foo(args: Int*) = args.map{_ + 1}

我可以这样称呼它:

foo(1, 2, 3, 4) //returns ArrayBuffer(2, 3, 4, 5)

但是,如果我想向其传递实际的序列(与一样getMethod),我会这样做:

val mylist = List(1, 2, 3, 4)
foo(mylist:_*)
2020-12-03