Reputation: 33534
Consider the code below:
private def test(some:String*){
}
private def call () {
val some = Array("asd", "zxc")
test(some)
}
It prints expect String, found Array[String]
Why? Are Scala varargs not arrays?
Note
I found several questions on Stack Overflow about Scala varargs, but all of them are about calling Java varargs methods or about converting Scala lists to arrays.
Upvotes: 96
Views: 47238
Reputation: 13924
Starting Scala 2.13.0, if you use some: _*
, you will get this warning:
Passing an explicit array value to a Scala
varargs
method is deprecated (since2.13.0
) and will result in a defensive copy; Use the more efficient non-copyingArraySeq.unsafeWrapArray
or an explicittoIndexedSeq
call
As suggested, use scala.collection.immutable.ArraySeq.unsafeWrapArray
:
unsafeWrapArray(some):_*
Also, another warning that you should be getting is this one
procedure syntax is deprecated: instead, add
: Unit =
to explicitly declaretest
's return type
To fix that, add =
just before function's opening bracket:
def test(some:String*) = {
Upvotes: 7
Reputation: 6315
It is simple:
def test(some:String*){}
def call () {
val some = Array("asd", "zxc")
test(some: _*)
}
Upvotes: 50
Reputation: 2726
Append :_*
to the parameter in test
like this
test(some:_*)
And it should work as you expect.
If you wonder what that magical :_*
does, please refer to this question.
Upvotes: 155