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[]); > >
Методы с переменным числом аргументов можно перегружать. Рассмотрим пример:
Перегрузка методов с аргументами переменной длины
При вызове метода без аргументов, подходят два метода — test(double. array) и test(int. array) . В этом случае будет вызван метод с меньшим диапазоном значений — test(int. array) .
При вызове метода test() с одним значением типа int — test(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); >>
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Конструктор
- Ключевое слово this
- Перегрузка
- Стек и куча
- Передача объектов в методы
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания
Varargs java что это
«Написать void метод, который принимает ряд целых чисел и возвращает их среднее арифметическое.» Шта?!
Wiun Уровень 16
14 апреля 2021
подскажите по последнему. верно сделал?)
public static boolean someFields(String s, boolean. b) < if (s.equals("AND")) < for (boolean bo : b) < if (!bo) < return false; >> return true; > else if (s.equals("OR")) < for (boolean bo : b) < if (bo) < return true; >> > else throw new IllegalArgumentException(); return false; >
и еще немного понять не могу почему в 16 строке возвращать должны фолс?
Александр Пьянов Уровень 41
22 января 2021
Сумма чисел от 1 до 100 = 5050, следовало бы или в varArg с 0 последовательность начинать или заполнять цикл с 1, внутренний перфекционист недоволен
Михаил Уровень 36
4 декабря 2020
Использование примеров со стримами только больше запутывает, чем вносит ясность об использовании varargs.
Иван Борзов Уровень 22
23 мая 2020
В домашнем задании номер 1 косяк: «написать void метод, который. возвращает среднее арифметическое». Void метод по определению ничего не возвращает)
Роман Кончалов Уровень 28 Expert
23 мая 2020
Мне кажется немного неуместным использование Stream API, появившегося в Java 8, в примерах про Varargs, появившегося в Java 5. Дело даже не в хронологии, а в намного большей сложности Stream API.
Денис Давыдов Уровень 38
23 мая 2020
В статье в слове «многоточие» опечатка.
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
VarArgs в Java

Привет! Это статья про VarArgs в Java.
Что такое VarArgs
Наверняка, если Вы читаете эту статью, Вы уже написали не один метод и даже не десять. И, конечно, Вам известно, что для каждого метода мы задаем типы параметров, которые требуются для работы метода. Например:
void myMethod(String s)
требует для работы одну переменную типа String, или
int findMax(int a, int b)
просит две переменные типа int.
Тем не менее, в Java есть еще одна «специальная» возможность работы с аргументами. Давайте приведем пример.
Представим, что нам нужно создать метод, который складывает переменные типа int.

Назовем этот метод addAll(). Сначала представим, что у нас два аргумента. Пишем такой код:
class MyClass < public int addAll ( int firstNumber , int secondNumber ) return firstNumber + secondNumber ;
Отлично! А что если мы хотим получить сумму трех чисел? Добавим еще один метод, только уже с тремя аргументами:
class MyClass < public int addAll ( int firstNumber , int secondNumber ) < return firstNumber + secondNumber ; public int addAll ( int firstNumber , int secondNumber , int thirdNumber ) < return firstNumber + secondNumber + thirdNumber ;
Замечательно. И запустим:
public class Test < public static void main ( String [ ] args ) < MyClass obj = new MyClass ( ) ; System . out . println ( obj . addAll ( 1 , 2 ) ) ; System . out . println ( obj . addAll ( 1 , 2 , 3 ) ) ;
Получим корректный результат:

Но а что, если мы хотим сложить четыре int-а? Пять int-ов? Шесть int-ов. Что, писать для каждого свой метод? Нет, это не выход. Именно тут нам и поможет VarArgs.
VarArgs переводится как Variable Arguments List — что-то типа «список аргументов переменной длины», или «список переменной длины, в которой лежат аргументы»:

Итак, вместо того, чтобы задавать конкретное количество аргументов — два, три, четыре — мы можем сказать Java, что мы не знаем, сколько их будет Но метод все равно сработает, и будет иметь доступ ко всем заданным аргументам. Давайте перепишем наш метод, используя VarArgs:
Возможное загрязнение кучи через параметры varargs
«Возможное загрязнение кучи через параметры varargs» — это предупреждение, которое может появиться в среде разработки Eclipse при использовании varargs с обобщенным типом в Java 7 и выше. Для понимания этого предупреждения необходимо разобраться с тем, что такое varargs и как они работают с обобщенными типами.
Varargs (Variable Arguments) — это возможность языка программирования Java, которая позволяет методу принимать неопределенное количество аргументов того же типа. Они представлены в виде массива внутри метода.
Обобщенные типы в Java — это параметризованные типы, которые позволяют работать с разными типами данных, сохраняя при этом типобезопасность.
public static <T> void genericVarargs(T. elements) < // тело метода >
При использовании обобщенных типов с varargs возможна ситуация, когда в куче (heap) может оказаться объект, несовместимый с ожидаемым типом, что приводит к ошибкам во время выполнения.
Например, рассмотрим следующий код:
public static <T> void genericVarargs(T. elements)
Здесь elements — это массив обобщенного типа T . Он присваивается массиву Object, затем в этот массив добавляется List. Когда мы пытаемся вернуть первый элемент массива как T , происходит исключение ClassCastException , так как List несовместим с ожидаемым типом.
Вот здесь и проявляется «загрязнение кучи» — в куче оказывается объект, который не соответствует ожидаемому типу.
Чтобы решить эту проблему, в Java 7 был введен аннотация @SafeVarargs .
@SafeVarargs public static <T> void genericVarargs(T. elements) < // тело метода >
Аннотация @SafeVarargs сообщает компилятору, что этот метод не будет выполнять небезопасные операции с его varargs параметрами типа. Это подавляет предупреждения о возможном загрязнении кучи. Однако использование этой аннотации подразумевает, что разработчик полностью понимает, как работают varargs и обобщенные типы, и гарантирует, что код не приведет к ClassCastException.