Что есть ... в сигнатуре метода - PullRequest
1 голос
/ 10 января 2012

Я впервые увидел это ... в сигнатуре метода.

Я попытался получить доступ к файлу .class.У него есть метод, определенный как ниже

public void addGraphData(GraphData... _graphData) {
}

И что GraphData - это не что иное, как POJO с геттерами и сеттерами.Почему в файле .class отображается GraphData... _graphData вместо GraphData _graphData ??

Ответы [ 6 ]

5 голосов
/ 10 января 2012

Функция называется Varargs

Она позволяет вам указать случайное количество аргументов для метода.

3 голосов
/ 10 января 2012

Это varargs и может использоваться только последним в списке параметров. Последний параметр может содержать более одного объекта.

public class C { 

    int i;
    String[] s;

    public C(int i, String... s){
        this.i = i;
        this.s=s;
    }
}
new C(4,"a","b") // will be transformed to int and String[]

Посмотрите, как "a" и "b" превратились в массив.

1 голос
/ 10 января 2012

Это синтаксис varargs: http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

Он обрабатывается как GraphData [], который может быть собран на лету как расширяемые параметры. Arrays.asList () является еще одним таким примером.

0 голосов
/ 10 января 2012

... указывает список параметров переменной длины.

printStrings(String... s){
   //internally s is an array with the parameters
   for(int i = 0; i < s.length;++i)
       System.out.print(s[i]);
}

printStrings("A","B","C","D");
//this is done by the compiler
printStrings(new String[]{"A","B","C","D"});
0 голосов
/ 10 января 2012

... указывает varargs на Java. Атрибут [vararg] указывает, что метод принимает переменное число параметров.Для этого последний параметр должен быть безопасным массивом типа VARIANT, который содержит все оставшиеся параметры:

[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list,
SAFEARRAY(VARIANT) last-param-name);

Синтаксис varargs в основном позволяет вам указать, что существуют возможные параметры, верно?Они могут быть там или не могут быть там.Это цель трех точек.Когда вы вызываете метод, вы можете вызывать его с этими параметрами или без них.Это было сделано, чтобы избежать необходимости передавать массивы в методы.

Посмотрите на это :

См. Когда вы используете varargs в Java?

final public class Main
{
    private void show(int []a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }
    }

    private void show(Object...a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }

        System.out.println("\nvarargs called");
    }

    public static void main(String... args)  //See also here.
    {
        int[]temp=new int[]{1,2,3,4};            

        Main main=new Main();
        main.show(temp);
        main.show();         //<-- This is possible.
    }
}

Это дляПо этой причине varargs в принципе не рекомендуется при перегрузке методов.


System.out.printf(); является примером varargs и определяется следующим образом.

public PrintStream printf(String format, Object ... args)
{
     return format(format, args);
}

format - Строка формата, как описано в синтаксисе строки формата

args - Аргументы, на которые ссылаются спецификаторы формата в строке формата.Если аргументов больше, чем спецификаторов формата, дополнительные аргументы игнорируются.Количество аргументов является переменным и может быть нулевым.Максимальное количество аргументов ограничено максимальным измерением массива Java, как определено в Спецификации виртуальной машины Java.Поведение нулевого аргумента зависит от преобразования.

0 голосов
/ 10 января 2012

Синоним этого обозначения для

public void addGraphData (GraphData [] _graphData) {

}

...