什么是...在方法签名中

时间:2012-01-10 12:32:15

标签: java class methods definition signature

我在方法签名中第一次看到...

我试图访问.class文件。它有一个定义如下的方法

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

而GraphData只不过是带有getter和setter的POJO。为什么.class文件显示GraphData... _graphData而不是GraphData _graphData ??

6 个答案:

答案 0 :(得分:5)

该功能称为Varargs

它允许您为方法提供随机数量的参数。

答案 1 :(得分:3)

它是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”如何转换为数组。

答案 2 :(得分:1)

这是varargs语法:http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

它被视为GraphData [],它可以作为可扩展参数动态构建。 Arrays.asList()是另一个这样的例子。

答案 3 :(得分:0)

这个符号

的同义词

public void addGraphData(GraphData [] _graphData){

}

答案 4 :(得分:0)

...表示Java中的varargs [vararg]属性指定该方法采用可变数量的参数。要实现此目的,最后一个参数必须是VARIANT类型的安全数组,其中包含所有剩余参数:

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

varargs语法基本上允许你指定有可能的参数,对吗?他们可以在那里,或者不能在那里。这就是三个点的目的。调用方法时,可以使用或不使用这些参数调用它。这样做是为了避免必须将数组传递给方法。

查看this

请参阅When do you use varargs in 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);
}
  

格式 - 格式字符串语法

中描述的格式字符串      

args - 格式字符串中格式说明符引用的参数。如果参数多于格式说明符,则忽略额外参数。参数的数量是可变的,可以为零。参数的最大数量受Java虚拟机规范定义的Java数组的最大维数限制。 null参数的行为取决于转换。

答案 5 :(得分:0)

...表示可变长度参数列表。

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"});