Подтвердить что ты не робот

Что означает "..." в списке параметров? doInBackground (String... params)

Я не понимаю этот синтаксис. Попытка Google разных слов плюс "..." бесполезна.

4b9b3361

Ответ 1

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

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

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

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

Следующее создает двоичное дерево типа String, с корнем "Red" и двумя ветвями "Blue" и "Green".

new MBTN<String>("Red", "Blue", "Green").

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

Ответ 3

Они являются "переменными аргументами" или 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 с появлением автоматического бокса.

Ответ 4

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

Итак, для метода, определенного как

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

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

foo();
foo("one param");
foo("one", "two", "three");

Ответ 5

Они являются параметрами переменной длины.

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

Ответ 6

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

//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 является "по существу" ссылочным массивом его объявленного типа.

Ответ 7

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

Ответ 8

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

см

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
}