【问题标题】:What is ... in a method signature什么是......在方法签名中
【发布时间】:2012-01-10 12:32:14
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java class methods definition signature


【解决方案1】:

该功能被称为Varargs

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

【讨论】:

    【解决方案2】:

    它是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”是如何变成一个数组的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这个符号的同义词

        public void addGraphData(GraphData[] _graphData) {

        }

        【讨论】:

        • 不,不是。它几乎是,但您可以致电addGraphData()。在这种情况下,_graphData 数组将是 null;它不会像您期望的那样为空。
        • 同意,可变参数在某些方面与数组不同,但几乎相同:)
        【解决方案5】:

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

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

        可变参数语法基本上可以让您指定可能的参数,对吗?他们可以在那里,也可以不在那里。这就是三个点的目的。当您调用该方法时,您可以使用或不使用这些参数来调用它。这样做是为了避免将数组传递给方法。

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

        format -格式字符串语法中描述的格式字符串

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2014-04-21
            • 1970-01-01
            • 1970-01-01
            • 2014-11-06
            • 2021-11-28
            • 1970-01-01
            • 2011-01-22
            • 2022-09-27
            • 2011-09-14
            相关资源
            最近更新 更多