以下是我可以在java中执行的操作,获取重复参数的结果并将其传递给另一个方法:
public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}
在scala中,它看起来像这样:
def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)
但这不会编译,bar签名需要一系列单独的字符串,而传入的args是一些非字符串结构。
现在我只是绕过数组。使用星号参数会非常好。有办法吗?
答案 0 :(得分:47)
Java假设您要自动将数组args
转换为varargs,但这对于接受Object类型的varargs的方法可能会有问题。
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
。
{{1}}
第{4.6.1节中的Language Reference中的例子很好地解释了这一点。
请注意,这些示例是使用Scala 2.8.0.RC2制作的。