String []和String ...(Var-args)在内部工作时是否相同?

时间:2012-01-06 07:03:24

标签: java arrays variadic-functions

class WrongOverloading{
    void something(String [] a){ .. }
    Integer something(String... aaa){ return 1;}
}

以上代码无法编译!编译器说这些是重复的方法。 所以使用String数组或String var-args完全相同意味着什么?

它们是如何在内部实施的?

9 个答案:

答案 0 :(得分:6)

它们实际上是相同的,除非编译器不接受varargs,除非它是最后一个参数,并且它不允许你将多个参数传递给数组。

public void methodA(int... ints, int a); // doesn't compile
public void methodA(int[] ints, int a); // compiles

public void methodB(int... ints); // compiles
public void methodC(int[] ints); // compiles

methodB(1); // compiles
methodB(1,2,3,4); // compiles
methodC(1); // doesn't compile
methodC(1,2,3,4); // doesn't compile

答案 1 :(得分:4)

来自this SO discussion

  

可变方法function(Object... args)的基础类型是   function(Object[] args)。 Sun以这种方式添加了varargs来保存   向后兼容性。

所以,正如其他答案所说,是的,它们是一样的。

答案 2 :(得分:1)

String... aaa就像拥有String[] aaa

我假设第二个函数后面的分号是拼写错误...

答案 3 :(得分:1)

是的,它是一样的。

您可以阅读this文章:

  

仍然必须在数组中传递多个参数,但varargs功能会自动化并隐藏该过程。

答案 4 :(得分:1)

[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)
    {
        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 :(得分:1)

是的,它们是相同的,因为当您使用省略号(String ...)调用方法时,它会转换为String数组。

答案 6 :(得分:1)

幕后的编译器实际上将你的var args方法转换为带有数组输入的方法。 这就是为什么你可以让一个var args方法重载数组作为输入的原因,因为在编译之后它们都是相同的。

答案 7 :(得分:1)

是的,两者都是一样的...... http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html刚看完这个网站,你就会知道

答案 8 :(得分:0)

在调用方法时,它不关心返回类型,它会考虑方法名称,参数数量和参数类型以及参数顺序。在这种情况下,您指定的方法具有相同名称的相同参数.bcoz用于var arg如果我们调用带有2个参数的方法将执行相同的方法,如果我们调用带有3个参数的方法,它将调用相同的方法。 在这里,如果我们调用某些东西(String [] a)和某些东西(String ... aaa)同样的方法将被调用.bcoz我们可以用var-arg替换数组然后会出现混乱,应该调用方法。那么方法歧义就会出现。这就是为什么它显示重复的方法。

这里如果我们将数组传递给var - arg参数方法,它将被执行。在内部,它将var - args转换为单维数组。