Описание и примеры varargs в Java
В языке Java существуют методы, которые могут принимать переменное количество аргументов. Они называются методами с аргументами переменной длины (var-args).
Для указания аргументов переменной длины служат три точки. Например:
static void test(int... array)
Наряду с параметром переменной длины у метода могут быть и "обычные" параметры. Но параметр переменной длины должен быть последним среди всех параметров, объявляемых в методе. Например:
static void test(double d, int... array)
Метод может содержать только один параметр с переменным количеством аргументов.
Применение аргументов переменной длины
В следующем примере показан метод test(), объявленный с переменным количеством аргументов типа int. Внутри метода мы обращаемся к этим переменным как к массиву. При вызове этого метода можно передать любое, даже нулевое количество аргументов, а также массив:
public class VarArgsExample {
static void test(int... array) {
System.out.println("Количество аргументов: " + array.length);
for (int a : array) {
System.out.print(a + " ");
}
System.out.println();
}
public static void main(String[] args) {
test();
test(1);
test(1, 2);
test(new int[]{1, 3});
}
}
Методы с переменным числом аргументов можно перегружать. Рассмотрим пример:
Перегрузка методов с аргументами переменной длины
При вызове метода без аргументов, подходят два метода - test(double... array)
и test(int... array)
. В этом случае будет вызван метод с меньшим диапазоном значений - test(int... array)
.
При вызове метода test()
с одним значением типа int
- test(3)
, будет выбран метод test(int a)
.
public class VarArgsExample2 {
static void test(double... array) {
System.out.println("test(double... array)");
System.out.println("Количество аргументов: " + array.length);
for (double a : array) {
System.out.print(a + " ");
}
System.out.println();
}
static void test(int... array) {
System.out.println("test(int... array)");
System.out.println("Количество аргументов: " + array.length);
for (int a : array) {
System.out.print(a + " ");
}
System.out.println();
}
static void test(int a) {
System.out.println("test(int a)");
}
public static void main(String[] args) {
test();
test(3);
test(1.0);
test(1, 2);
}
}
Результат выполнения:
test(int... array)
Количество аргументов: 0
test(int a)
test(double... array)
Количество аргументов: 1
1.0
test(int... array)
Количество аргументов: 2
1 2
При перегрузке метода, принимающего аргументы переменной длины, могут происходить непредвиденные ошибки. Они связаны с неоднозначностью, которая может возникать при вызове перегружаемого метода с аргументами переменной длины.
В следующем примере метод test
перегружен - один вариант принимает значения var-ags типа boolean
, а второй тоже var-ags, но типа int
. При вызове метода test() без аргументов, возникает ошибка неоднозначности - JVM не может выбрать необходимый метод.
Аргументы переменной длины и неоднозначность
public class VarArgsExample3 {
static void test(boolean... array) {
System.out.println("test(boolean... array)");
System.out.println("Количество аргументов: " + array.length);
for (boolean a : array) {
System.out.print(a + " ");
}
System.out.println();
}
static void test(int... array) {
System.out.println("test(int... array)");
System.out.println("Количество аргументов: " + array.length);
for (int a : array) {
System.out.print(a + " ");
}
System.out.println();
}
public static void main(String[] args) {
// test();// ошибка неоднозначности
test(3);
test(1, 2);
}
}
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.