2010-07-01 5 views

ответ

765

Это означает, что в качестве аргумента (ов) для этого метода могут быть переданы ноль или более объектов 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"}); 

Важное примечание: Аргумент (s), пройденный таким образом, всегда является массивом - даже если есть только один. Убедитесь, что вы так относитесь к этому методу в теле метода.

Важное примечание 2: Аргумент, который получает ..., должен быть последним в сигнатуре метода. Итак, myMethod(int i, String... strings) в порядке, но myMethod(String... strings, int i) не в порядке.

Спасибо Vash за разъяснения в его комментарии.

+91

Вы ошибаетесь в том, что «один или несколько», с varargs, мы можем указать 0 или более, и это должен быть всегда последний параметр в методе. Метод x (String ... params) может быть вызван как x() или метод y (String pram, String ... params) можно вызвать как y ("1") –

+0

Желаю, если бы это тоже сработало.myMethod ("один", "два", "три", новый String [] {"a", "b", "c" "}); – 2sb

+1

Почему вам разрешено давать параметры метода 0? приводят к исключению ArrayIndexOutOfBoundsException. Теперь вам всегда нужно учитывать этот случай. –

95

Эта функция называется varargs, и это функция, представленная в Java 5. Это означает, что функция может принимать несколько String аргументов:

myMethod("foo", "bar"); 
myMethod("foo", "bar", "baz"); 
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array 

Затем вы можете использовать String вар как массив :

public void myMethod(String... strings){ 
    for(String whatever : strings){ 
     // do what ever you want 
    } 

    // the code above is is equivalent to 
    for(int i = 0; i < strings.length; i++){ 
     // classical for. In this case you use strings[i] 
    } 
} 

Этот ответ заимствует из Kiswa-х и Лоренцо ... а также от комментариев в Graphain в.

+12

Когда код попадает в байт-код, он * * является массивом. Все остальное является синтаксисом, поддерживаемым только компилятором. –

+0

Этот ответ сильно заимствует у кисва и Лоренцо, если я правильно прочитал правки. –

+1

@Graphaian да, сэр. – Cristian

12

Это способ передачи Java varargs (аргументы переменного номера).

Если вы знакомы с C, это похоже на синтаксис ... использовал его в printf функции:

int printf(const char * format, ...); 

но безопасный способ типа: каждый аргумент должен соответствовать указанному типу (в вашем образец, они должны быть все String).

Это простой пример того, как можно использовать переменные аргументы:

class VarargSample { 

    public static void PrintMultipleStrings(String... strings) { 
     for(String s : strings) { 
      System.out.println(s); 
     } 
    } 

    public static void main(String... args) { 
     PrintMultipleStrings("Hello", "world"); 
    } 
} 

... аргумент на самом деле массив, так что вы можете передать String[] в качестве параметра.

9

Возможно, это пример синтаксического сахара, поскольку он реализован как массив в любом случае (это не значит, что это бесполезно). Я предпочитаю передавать массив, чтобы он был ясен, а также объявлять методы с массивами данных тип. Скорее, мнение, чем ответ.

3

Просто думать о нем, как ключевое слово params в C#, если вы едете из этого фона :)

1

действительно распространенный способ увидеть наглядный пример использования трех точек он присутствует в одном из самые известные методы в android AsyncTask (что сегодня не слишком много используется из-за RXJAVA, не говоря уже о компонентах Google Architecture), вы можете найти тысячи примеров, ищущих этот термин, и лучший способ понять и никогда не забывать смысл трех точек заключается в том, что они выражают ... сомнение ... точно так же, как на общем языке. А именно, неясно, сколько параметров необходимо передать, может быть 0, может быть 1 может быть больше (массив) ...

3

Также, чтобы пролить некоторый свет, важно знать, что var- Параметры arg ограничены одним, и вы не можете иметь несколько параметров var-art. Например, это Нелегальное:

public void myMethod(String... strings, int ... ints){ 
// method body 
} 
6

Это переменные аргументы:)

переменные аргументы коротка для аргументов переменной длины является функция, которая позволяет метод принимать переменное число аргументов (ноль или более). С помощью varargs стало проще создавать методы, которые должны принимать переменное количество аргументов. Особенность переменного аргумента была добавлена ​​в Java 5.

Синтаксиса переменной длина

vararg является secified три многоточия (три точки) после типа данных, его общая форма

return_type method_name(data_type ... variableName){ 
} 

потребности в переменной длину

до Java 5, в случае, если существует необходимость переменного числа аргументов, было два способа справиться с этим

Если максимальное количество аргументов, метод может принимать, был небольшим и известен, то могут быть созданы перегруженные версии метода. Если максимальное количество аргументов, которые мог принять метод, было большим или/и неизвестно, то подход заключался в том, чтобы поместить эти аргументы в массив и передать их методу, который принимает массив в качестве параметра. Эти два подхода были подвержены ошибкам - каждый раз создавали массив параметров и их трудно поддерживать, поскольку добавление нового аргумента может привести к написанию нового перегруженного метода.

Преимущества списков параметров

предлагает гораздо более простой вариант. Меньше кода, так как нет необходимости писать перегруженные методы.

Пример списков параметров

public class VarargsExample { 
public void displayData(String ... values){ 
    System.out.println("Number of arguments passed " + values.length); 
    for(String s : values){ 
    System.out.println(s + " "); 
    } 
} 

public static void main(String[] args) { 
    VarargsExample vObj = new VarargsExample(); 
    // four args 
    vObj.displayData("var", "args", "are", "passed"); 
    //three args 
    vObj.displayData("Three", "args", "passed"); 
    // no-arg 
    vObj.displayData(); 
} 
} 
Output 

Number of arguments passed 4 
var 
args 
are 
passed 
Number of arguments passed 3 
Three 
args 
passed 
Number of arguments passed 0 

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

Ограничение с переменным числом аргументов

Можно иметь и другие параметры с параметром переменной длиной в способе, однако в этом случае переменной длина параметр должен быть последним параметром объявлен методом.

void displayValues(int a, int b, int … values) // OK 
    void displayValues(int a, int b, int … values, int c) // compiler error 

Другое ограничение с помощью varargs заключается в том, что должен быть только один параметр varargs.

void displayValues(int a, int b, int … values, int … moreValues) // Compiler error 

Перегрузки Методы переменной длины

Это можно перегрузить метод, который принимает параметр переменной длины. Метод Varargs может быть перегружен -

Типы его параметра vararg могут быть разными. Добавление других параметров. Примера перегрузки методы

переменных аргументы
public class OverloadingVarargsExp { 
// Method which has string vararg parameter 
public void displayData(String ... values){ 
    System.out.println("Number of arguments passed " + values.length); 
    for(String s : values){ 
    System.out.println(s + " "); 
    } 
} 

// Method which has int vararg parameter 
public void displayData(int ... values){ 
    System.out.println("Number of arguments passed " + values.length); 
    for(int i : values){ 
    System.out.println(i + " "); 
    } 
} 

// Method with int vararg and one more string parameter 
public void displayData(String a, int ... values){ 
    System.out.println(" a " + a); 
    System.out.println("Number of arguments passed " + values.length); 
    for(int i : values){ 
    System.out.println(i + " "); 
    } 
} 

public static void main(String[] args) { 
    OverloadingVarargsExp vObj = new OverloadingVarargsExp(); 
    // four string args 
    vObj.displayData("var", "args", "are", "passed"); 

    // two int args 
    vObj.displayData(10, 20); 

    // One String param and two int args 
    vObj.displayData("Test", 20, 30); 
} 
} 
Output 

Number of arguments passed 4 
var 
args 
are 
passed 

Number of arguments passed 2 
10 
20 

a Test 
Number of arguments passed 2 
20 
30 

и перегрузки переменной длиной неоднозначности

В некоторых случаях вызова может быть неоднозначными в то время как мы перегружены методы переменных аргументов. Давайте посмотрим пример

public class OverloadingVarargsExp { 
// Method which has string vararg parameter 
public void displayData(String ... values){ 
    System.out.println("Number of arguments passed " + values.length); 
    for(String s : values){ 
    System.out.println(s + " "); 
    } 
} 

// Method which has int vararg parameter 
public void displayData(int ... values){ 
    System.out.println("Number of arguments passed " + values.length); 
    for(int i : values){ 
    System.out.println(i + " "); 
    } 
} 

public static void main(String[] args) { 
    OverloadingVarargsExp vObj = new OverloadingVarargsExp(); 
    // four string args 
    vObj.displayData("var", "args", "are", "passed"); 

    // two int args 
    vObj.displayData(10, 20); 

    // This call is ambiguous 
    vObj.displayData(); 
} 
} 

В этой программе, когда мы делаем вызов displayData() метод без какого-либо параметра он бросает ошибку, потому что компилятор не уверен, является ли этот вызов метода для displayData(String ... values) или displayData(int ... values)

Точно так же, если мы перегрузили методы, где один имеет vararg метод одного типа и другой метод имеет один параметр и vararg параметр того же типа, то и у нас есть неоднозначность - Как Exp - displayData(int ... values) и displayData(int a, int ... values)

Эти два перегруженных метода всегда будут иметь двусмысленность.

2

String... такая же, как String[]

import java.lang.*; 

     public class MyClassTest { 

     //public static void main(String... args) { 

     public static void main(String[] args) { 
     for(String str: args) { 
     System.out.println(str); 

     } 
     } 
     } 
+1

Если 'String ...' совпадает с 'String []', не могли бы вы просто так сказать? –

+0

Ваши слова кратки и понятны. Благодарю. –

+3

Технически не верно, потому что 'String []' требует аргумента (по крайней мере, пустой массив), тогда как 'String ...' не делает (см. Ответ выше). – Aurel

Смежные вопросы