96

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.

3 Answers 3

155

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.

Sign up to request clarification or add additional context in comments.

Comments

50

It is simple:

def test(some:String*){}

def call () {
  val some = Array("asd", "zxc")
  test(some: _*)
}

Comments

8

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 (since 2.13.0) and will result in a defensive copy; Use the more efficient non-copying ArraySeq.unsafeWrapArray or an explicit toIndexedSeq 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 declare test's return type

To fix that, add = just before function's opening bracket:

def test(some:String*) = {

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.