Результат

Без аргументов:s= NaN

C аргументом 10:s=10,00

C аргументами 10,20,30:s=20,00

 
 

Список параметров в заголовке метода может содержать как параметр с переменным количеством аргументов, так и обычные параметры. Однако параметр с переменным количеством аргументов должен быть последним параметром в списке и единственным в методе.

Например, следующее объявления методов являются ошибочными:

//Неверная запись!

void myMethod(int a, int b, int...v, boolean f) {}

void myMethod(int a, int b, int...v, double...w ) {}

В первом случае предпринимается попытка объявления обычного параметра после параметра с переменным количеством аргументов, что недопустимо. А во втором – попытка объявления второго параметра с переменным количеством аргументов, что тоже запрещено.

Следующее объявление метода считается вполне корректным:

void myMethod(int a, int b, double c, int...v) {}

При вызове такого метода, первые три аргумента будут соответствовать первым трем параметрам a,b,c. Все остальные аргументы считаются принадлежащими параметру v.

Метод с переменным количеством аргументов можно перегружать. В этом случае перегруженные варианты должны различаться либо типом, либо количеством параметров. Например, в следующем классе все перегруженные варианты метода get записаны корректно:

class MyClass {

void get(int...v){}

void get(int n){}

void get(double...v){}

void get(int n, double...v){}

}

Обратите внимание, что метод с переменным количеством аргументов может быть перегружен также методом, который не поддерживает эту возможность. Например, в приведенном классе MyClass метод get(int...v) перегружен методом get(int n). Если при вызове метода указать один целочисленный аргумент, то будет вызван метод get(int n). В случае передачи методу двух и более аргументов типа int программа будет использовать версию метода get(int...v) с переменным количеством аргументов.

Будьте внимательны, используя перегруженные варианты методов с переменным количеством аргументов, так как при их вызове могут возникать неопределенности. Так, например, если будет вызван метод get() без аргументов, то это приведет к ошибке, так как данный вызов может быть преобразован в обращение к методу get(int...v) или get(double...v). Оба варианта допустимы. Поэтому вызов принципиально неоднозначен.