Java предполагает, что вы хотите автоматически преобразовать массив args
в varargs, но это может быть проблематично с методами, которые принимают varargs типа Object.
Scala требует, чтобы вы были явными, присваивая аргумент : _*
.
scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit
scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit
scala> foo("1", "2")
count=2
Вы можете использовать : _*
для любого подтипа Seq
или для любого, неявно преобразуемого в Seq
, в частности Array
.
scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int
scala> foo(1, 2, 3)
res0: Int = 3
scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3
scala> foo(List(1, 2, 3): _*)
res2: Int = 3
scala> foo(Array(1, 2, 3): _*)
res3: Int = 3
scala> import collection.JavaConversions._
import collection.JavaConversions._
scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3
Это хорошо объяснено на примерах в справочнике по языку , в разделе 4.6.2.
Обратите внимание, что эти примеры сделаны с использованием Scala 2.8.0.RC2.