Что находится в сигнатуре метода

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

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

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

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


person Some Java Guy    schedule 10.01.2012    source источник
comment
возможный дубликат varargs и аргумента '...'   -  person Oliver Charlesworth    schedule 10.01.2012


Ответы (6)


Это 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" превратились в массив.

person Farmor    schedule 10.01.2012

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

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

person Gijs Overvliet    schedule 10.01.2012

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

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

person Dan Hardiker    schedule 10.01.2012

Это обозначение является синонимом

public void addGraphData (GraphData [] _graphData) {

}

person mishadoff    schedule 10.01.2012
comment
Нет, это не так. Это почти так, но вы можете позвонить addGraphData(). В этом случае массив _graphData будет null; он не будет пустым, как можно было бы ожидать. - person user268396; 10.01.2012
comment
согласен, varargs в чем-то отличается от массива, но это почти то же самое :) - person mishadoff; 10.01.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. Поведение при нулевом аргументе зависит от преобразования.

person Lion    schedule 10.01.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"});
person josefx    schedule 10.01.2012