Что означает «...» в списке параметров? doInBackground (String ... params) - PullRequest
18 голосов
/ 18 октября 2010

Я не понимаю этот синтаксис.Попытка гуглить различные слова плюс "..." бесполезна.

Ответы [ 8 ]

14 голосов
/ 18 октября 2010

Это называется varargs .Этот факт должен дать лучших результатов Google .

12 голосов
/ 18 октября 2010

Это называется Variadic function (вики-страница с примерами на многих языках).

В компьютерном программировании функция variadic - это функция неопределенной арности, т.е.принимает переменное количество аргументов.Поддержка функций variadic сильно отличается в разных языках программирования.Есть много математических и логических операций, которые естественным образом представляются в виде переменных функций.Например, суммирование чисел или объединение строк или других последовательностей являются операциями, которые могут логически применяться к любому количеству операндов.Другая операция, которая была реализована как функция с переменным значением во многих языках, - это форматирование вывода.Функция C printf и формат функции Common Lisp - два таких примера.Оба принимают один аргумент, который определяет форматирование вывода, и любое количество аргументов, которые предоставляют значения для форматирования.Функции Variadic могут выявить проблемы безопасности типов в некоторых языках.Например, printf C, если используется неосторожно, может вызвать класс дыр в безопасности, известных как атаки форматной строки.Атака возможна, потому что поддержка языка для функций с переменными параметрами не является типобезопасной;это позволяет функции пытаться вытолкнуть больше аргументов из стека, чем было размещено там - повредить стек и привести к неожиданному поведению.Функциональность Variadic может рассматриваться как дополнительная к функции apply, которая принимает функцию и список / последовательность / массив в качестве аргументов, а затем вызывает функцию один раз, причем аргументы являются элементами списка.

Один из личных любимых неиспользуемых функций Java .В основном это ссылочный массив, который построен из элементов.Один из лучших способов его использования - это конструктор класса или метод, в котором вам нужно постоянно находить значение, например, максимум 2, 3, 4, 5 элементов ввода.

Один из примеров - когда я построилgeneric binary tree node, для задач кодирования я использовал это в конструкторе.Это позволило мне просто добавить элементы в дерево и распределить их.

После этого создается двоичное дерево типа String с корневыми "Red" и 2 ветвями "Blue" и "Green".

new MBTN<String>("Red", "Blue", "Green").
* 1025.* Не могли бы вы подумать, какими будут альтернативы: D Вы даже не можете просто создать общий массив элементов, так что это растянется как ад.Это определенно не бесполезно.
10 голосов
/ 18 октября 2010

Это «переменные аргументы» или varargs (для краткости).

В основном это позволяет передавать неопределенное количество строк, поэтому сигнатура метода

public void printStuff(String...messages)

Эффективнообрабатывать следующие вызовы

printStuff("hi");
printStuff("hi", "bye");
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later");

Вы можете эффективно рассматривать это как тип автобокса.Аргумент printStuff можно рассматривать как массив, поэтому концептуально printStuff(String...messages) обрабатывается как printStuff(String[] messages).С учетом вышеприведенных вызовов, действующих как

printStuff(new String[] {"hi"});
printStuff(new String[] {"hi", "bye"});
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"});

Для внутреннего доступа к сообщениям вы используете типичные List обработчики примитивов.Что-то вроде

...
if (messages != null) {
  for (String message : messages) {
    System.out.println(message);
  }
}
...

Отсутствие необходимости создавать массивы - это немного синтаксического сахара, добавленного в Java с появлением автоматического бокса.

3 голосов
/ 18 октября 2010

Как уже упоминалось @BalusC, это параметр varags. Это означает, что вы можете передать переменное число аргументов этому методу.

То есть для метода, определенного как

public void foo(String...strings) {  }

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

foo();
foo("one param");
foo("one", "two", "three");
1 голос
/ 18 октября 2010

Как упоминалось всеми ... переменные аргументы (или переменные) позволяют вам сделать это ....

//Method we're using for varargs
public void doSomething(String... datas) {
    if (datas == null || datas.length == 0) {
        System.out.println("We got nothing");
    } else {
        for (String data: datas) {
            System.out.println(data);
        }
    }
}

Следовательно, все упомянутые ниже звонки действительны ....

String d[] = {"1", "2", "3"};
doSomething(d); //An array of String, as long as the type is exactly as the varargs type.

//OR
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me....

//OR 
doSomething("1"); //Exactly 1;

Внутренне varargs является "по существу" ссылочным массивом объявленного типа.

1 голос
/ 18 октября 2010

Это параметры переменной длины.

Вот одна ссылка с примером .

0 голосов
/ 18 октября 2010

Это означает «Произвольное количество аргументов», означающее, что вы можете передать в метод неизвестное количество параметров.

см

http://download.oracle.com/javase/tutorial/java/javaOO/arguments.html Ищите раздел «Произвольное количество аргументов»

public Polygon polygonFrom(Point... corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
            + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ;
    lengthOfSide1 = Math.sqrt(squareOfSide1);
    // more method body code follows that creates 
    // and returns a polygon connecting the Points
}
0 голосов
/ 18 октября 2010

Это Java-метод, который принимает произвольное переменное число параметров

...