17.5. Annotating varargs Methods
Problem
You’ve created a Scala method with a varargs field, and would like to be able to call that method from Java code.
Solution
When a Scala method has a field that takes a variable number of
arguments, mark it with the @varargs
annotation.
For example, the printAll
method in the following Scala class is marked with @varargs
so it can be called as desired from
Java:
package
varargs
import
scala.annotation.varargs
class
Printer
{
@varargs
def
printAll
(
args
:
String*
)
{
args
.
foreach
(
)
println
}
}
The printAll
method can now be
called from a Java program with a variable number of parameters, as
shown in this example:
package
varargs
;
public
class
Main
{
public
static
void
main
(
String
[]
args
)
{
Printer
p
=
new
Printer
();
p
.
printAll
(
"Hello"
);
p
.
printAll
(
"Hello, "
,
"world"
);
}
}
When this code is run, it results in the following output:
Hello Hello, world
Discussion
If the @varargs
annotation
isn’t used on the printAll
method,
the Java code shown won’t even compile, failing with the following
compiler errors:
Main.java:7: printAll(scala.collection.Seq<java.lang.String>) in varargs.Printer cannot be applied to (java.lang.String) [error] p.printAll("Hello"); [error] ^ Main.java:8: printAll(scala.collection.Seq<java.lang.String>) in varargs.Printer cannot be applied to (java.lang.String,java.lang.String) [error] p.printAll("Hello, ", "world"); [error] ^
Without the @varargs
annotation, from a Java perspective, the printAll
method appears to take a scala.collection.Seq<java.lang.String> ...
Get Scala Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.