This is an excerpt from the Scala Cookbook (partially modified for the internet). This is a short recipe, Recipe 17.5, “How to annotate varargs methods in Scala.”
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(print) 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>
as its argument.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |