Java varargs

В языке Java существуют методы, которые могут принимать переменное количество аргументов. Они называются методами с аргументами переменной длины (var-args).

Для указания аргументов переменной длины служат три точки ( . . . ). Например:

static void test(int... array)

Наряду с параметром переменной длины у метода могут быть и "обычные" параметры. Но параметр переменной длины должен быть последним среди всех параметров, объявляемых в методе. Например:

static void test(double d, int... array)

Метод может содержать только один параметр с переменным количеством аргументов.

Применение аргументов переменной длины

В следующем примере показан метод test(), объявленный с переменным количеством аргументов типа int. Внутри метода мы обращаемся к этим переменным как к массиву. При вызове этого метода можно передать любое, даже нулевое количество аргументов, а также массив:

public class VarArgs {
    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() с одним значением типа inttest(3)будет выбран метод test(int a).

public class VarArgs2 {
    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 VarArgs3 {
    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);
    }
}
Read also:
Comments