Урок 7

Аргументы переменной длины


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

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

static void test(int... array)

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

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

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

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

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});
    }
}
public class PassArray {
    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(new int[]{});
        test(new int[]{1});
        test(new int[]{1, 3});
    }
}

Пример 2. Перегрузка методов с аргументами переменной длины

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)");
    }

    static void test(String str, double... array) {
        System.out.println("String str, double... array");
        System.out.println("Количество аргументов: " + array.length);
        for (double a : array) {
            System.out.print(a + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        test();
        test(3);
        test(1.0);
        test(1, 2);
        test("Проверка", 1, 2);
    }
}

При перегрузке метода, принимающего аргументы переменной длины, могут происходить непредвиденные ошибки. Они связаны с неоднозначностью, которая может возникать при вызове перегружаемого метода с аргументами переменной длины.

Пример 3. Аргументы переменной длины и неоднозначность

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);
    }
}


0 comments
Leave your comment: