Что означают 3 точки в следующем методе?
public void myMethod(String... strings){
// method body
}
источник
Что означают 3 точки в следующем методе?
public void myMethod(String... strings){
// method body
}
Это означает, что ноль или более объектов String (или их массив) могут быть переданы в качестве аргумента (ов) для этого метода.
См. Раздел «Произвольное количество аргументов» здесь: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
В вашем примере вы можете назвать это как-либо из следующего:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
Важное примечание: аргумент (ы), передаваемый таким образом, всегда является массивом - даже если он только один. Убедитесь, что вы относитесь именно к этому в теле метода.
Важное примечание 2: аргумент, который получает значение, ...
должен быть последним в сигнатуре метода. Итак, myMethod(int i, String... strings)
все в порядке, но myMethod(String... strings, int i)
не в порядке.
Спасибо Vash за разъяснения в своем комментарии.
someMethod(new SomeType[] { })
. Это было бы взломом, не так ли?Эта функция называется varargs , и она появилась в Java 5. Она означает, что функция может получать несколько
String
аргументов:Затем вы можете использовать
String
var в качестве массива:Этот ответ в значительной степени заимствован у Кишвы и Лоренцо ... а также из комментария Графена.
источник
Это Вараргс :)
Varargs, короткий для аргументов переменной длины, является функцией, которая позволяет методу принимать переменное количество аргументов (ноль или более). С помощью varargs стало проще создавать методы, которые должны принимать переменное число аргументов. Функция переменного аргумента была добавлена в Java 5.
Синтаксис varargs
Vararg обозначается тремя многоточиями (три точки) после типа данных, его общая форма
Потребность в варагс
До Java 5, в случае необходимости переменного количества аргументов, было два способа справиться с этим
Если максимальное количество аргументов, которое может принять метод, было небольшим и известным, то могут быть созданы перегруженные версии метода. Если максимальное количество аргументов, которое может принять метод, было большим или неизвестным, тогда подход заключался в том, чтобы поместить эти аргументы в массив и передать их методу, который принимает массив в качестве параметра. Эти 2 подхода были подвержены ошибкам - каждый раз создавал массив параметров и их было сложно поддерживать - поскольку добавление нового аргумента может привести к написанию нового перегруженного метода.
Преимущества varargs
Предлагает гораздо более простой вариант. Меньше кода, так как нет необходимости писать перегруженные методы.
Пример varargs
Из программы видно, что длина используется здесь для определения количества аргументов, переданных методу. Это возможно, потому что varargs неявно передаются в виде массива. Независимо от того, какие аргументы передаются как varargs, они хранятся в массиве, на который ссылается имя, данное varargs. В этой программе имя массива есть значения. Также обратите внимание, что метод вызывается с другим количеством аргументов, сначала вызывается с четырьмя аргументами, затем с тремя аргументами, а затем с нулевыми аргументами. Все эти вызовы обрабатываются одним и тем же методом, который принимает varargs.
Ограничение с помощью varargs
В методе могут быть другие параметры с параметром varargs, однако в этом случае параметр varargs должен быть последним параметром, объявленным методом.
Другое ограничение для varargs заключается в том, что должен быть только один параметр varargs.
Перегрузка varargs Методы
Возможно перегрузить метод, который принимает параметр varargs. Метод Varargs может быть перегружен -
Типы его параметра vararg могут быть разными. Добавляя другие параметры. Пример перегрузки метода varargs
Varargs и перегрузки двусмысленность
В некоторых случаях вызов может быть неоднозначным, пока мы перегружаем метод varargs. Давайте посмотрим пример
В этой программе, когда мы вызываем метод displayData () без каких-либо параметров, он выдает ошибку, потому что компилятор не уверен, предназначен ли этот вызов метода для
displayData(String ... values)
илиdisplayData(int ... values)
Таким же образом, если у нас есть перегруженные методы, где у одного есть
vararg
метод одного типа, а у другого метода есть один параметр иvararg
параметр того же типа, то у нас также есть неоднозначность - как Exp -displayData(int ... values)
иdisplayData(int a, int ... values)
Эти два перегруженных метода всегда будут иметь неоднозначность.
источник
Это Java-способ передачи varargs (аргументов с переменным числом).
Если вы знакомы с C, это похоже на
...
синтаксис, используемый вprintf
функции:но безопасным способом: каждый аргумент должен соответствовать указанному типу (в вашем примере они должны быть всеми
String
).Это простой пример того, как вы можете использовать varargs :
...
Аргумент на самом деле массив, так что вы могли бы пропускать вString[]
качестве параметра.источник
Возможно, это пример синтаксического сахара, так как он в любом случае реализован в виде массива (что не означает, что он бесполезен) - я предпочитаю передавать массив, чтобы сохранить его ясность, а также объявлять методы с массивами заданного типа. Но скорее мнение, чем ответ.
источник
Также, чтобы пролить некоторый свет, важно знать, что параметры var-arg ограничены одним, и вы не можете иметь несколько параметров var-art. Например, это нелегально:
источник
Просто подумайте об этом как о ключевом слове
params
в C #, если вы пришли из этого фона :)источник
Действительно распространенный способ увидеть наглядный пример использования трех точек, присутствующих в одном из самых известных методов в Android AsyncTask (который сегодня используется не слишком часто из-за RXJAVA, не говоря уже о компонентах архитектуры Google), Вы можете найти тысячи примеров, ищущих этот термин, и лучший способ понять и никогда больше не забывать о значении этих трех точек - это то, что они выражают ... сомнение ... как в обычном языке. А именно, не ясно, сколько параметров должно быть передано, может быть 0, может быть 1, может быть больше (массив) ...
источник
String...
такой же какString[]
источник
String...
это так жеString[]
, не могли бы вы просто сказать это?String[]
требует аргумент (по крайней мере, пустой массив), тогда какString...
нет (см. Ответ выше).В дополнение к другим хорошо написанным ответам, преимущество, которое
varagrs
я нашел полезным, состоит в том, что, когда я вызываю метод с массивом в качестве типа параметра, он избавляет от необходимости создавать массив; добавить элементы, а затем отправить его. Вместо этого я могу просто вызвать метод с любым количеством значений; от нуля до многих.источник
Пример 1:
Пример 2:
источник
Синтаксис: (Тройная точка ...) -> Означает, что мы можем добавить ноль или более объектов, передаваемых в аргументах, или передавать массив объектов типа.
Определение: 1) Аргумент Object ... - это просто ссылка на массив объектов.
2) ('String []' или String ...) Может обрабатывать любое количество строковых объектов. Внутренне он использует массив объектов ссылочного типа.
3) Если вы хотите вызвать метод с одним аргументом, а он является массивом, вы должны явно обернуть его в
Приложение: в основном используется, когда число аргументов является динамическим (число аргументов известно во время выполнения) и в переопределении. Общее правило - В методе мы можем передавать любые типы и любое количество аргументов. Мы не можем добавлять аргументы объекта (...) перед какими-либо конкретными аргументами. т.е.
источник