Calling a Variable Arity Method
Example 3.15 illustrates various aspects of calling a variable arity method. The method flexiPrint() in the VarargsDemo class has a variable arity parameter:
public static void flexiPrint(Object… data) { // Object[]
//…
}
The variable arity method prints the name of the Class object representing the actual array that is passed at runtime. It prints the number of elements in this array as well as the text representation of each element in the array.
The method flexiPrint() is called in the main() method. First it is called with the values of primitive types and Strings ((1) to (8)), and then it is called with the program arguments (p. 141) supplied on the command line ((9) to (11)).
Compiling the program results in a warning at (9), which we ignore for the time being. The program can still be run, as shown in Example 3.15. The numbers at the end of the lines in the output relate to numbers in the code, and are not printed by the program.
Example 3.15 Calling a Variable Arity Method
public class VarargsDemo {
public static void flexiPrint(Object… data) { // Object[]
// Print the name of the Class object for the varargs parameter.
System.out.print(“Type: ” + data.getClass().getName());
System.out.println(” No. of elements: ” + data.length);
System.out.print(“Element values: “);
for(Object element : data)
System.out.print(element + ” “);
System.out.println();
}
public static void main(String… args) {
int day = 13;
String monthName = “August”;
int year = 2009;
// Passing primitives and non-array types:
flexiPrint(); // (1) new Object[] {}
flexiPrint(day); // (2) new Object[] {Integer.valueOf(day)}
flexiPrint(day, monthName); // (3) new Object[] {Integer.valueOf(day),
// monthName}
flexiPrint(day, monthName, year); // (4) new Object[] {Integer.valueOf(day),
// monthName,
// Integer.valueOf(year)}
System.out.println();
// Passing an array type:
Object[] dateInfo = {day, // (5) new Object[] {Integer.valueOf(day),
monthName, // monthName,
year}; // Integer.valueOf(year)}
flexiPrint(dateInfo); // (6) Non-varargs call
flexiPrint((Object) dateInfo); // (7) new Object[] {(Object) dateInfo}
flexiPrint(new Object[]{dateInfo});// (8) Non-varargs call
System.out.println();
// Explicit varargs or non-varargs call:
flexiPrint(args); // (9) Warning!
flexiPrint((Object) args); // (10) Explicit varargs call
flexiPrint((Object[]) args); // (11) Explicit non-varargs call
}
}
Compiling the program:
>
javac VarargsDemo.java
VarargsDemo.java:41: warning: non-varargs call of varargs method with inexact
argument type for last parameter;
flexiPrint(args); // (9) Warning!
^
cast to Object for a varargs call
cast to Object[] for a non-varargs call and to suppress this warning
1 warning
Running the program:
>
java VarargsDemo To arg or not to arg
Type: [Ljava.lang.Object; No. of elements: 0 (1)
Element values:
Type: [Ljava.lang.Object; No. of elements: 1 (2)
Element values: 13
Type: [Ljava.lang.Object; No. of elements: 2 (3)
Element values: 13 August
Type: [Ljava.lang.Object; No. of elements: 3 (4)
Element values: 13 August 2009
Type: [Ljava.lang.Object; No. of elements: 3 (6)
Element values: 13 August 2009
Type: [Ljava.lang.Object; No. of elements: 1 (7)
Element values: [Ljava.lang.Object;@1eed786
Type: [Ljava.lang.Object; No. of elements: 1 (8)
Element values: [Ljava.lang.Object;@1eed786
Type: [Ljava.lang.String; No. of elements: 6 (9)
Element values: To arg or not to arg
Type: [Ljava.lang.Object; No. of elements: 1 (10)
Element values: [Ljava.lang.String;@187aeca
Type: [Ljava.lang.String; No. of elements: 6 (11)
Element values: To arg or not to arg