2012-01-06 130 views
7
class WrongOverloading{ 
    void something(String [] a){ .. } 
    Integer something(String... aaa){ return 1;} 
} 

上面的代码不能编译!编译器说这些是重复的方法。 因此使用String数组或String var-args的意思是一样的吗?String []和String ...(Var-args)在内部工作时是否相同?

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

+0

为什么你在函数的末尾使用分号? – Ankit 2012-01-06 07:06:28

回答

6

他们实际上是相同的,只是编译器将不接受可变参数,除非它的最后一个参数,它将不允许您将多个参数传递给数组。

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

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

我假设第二个功能分号后是一个错字...

1

是的,这是相同的。

您可以阅读this文章:

它仍然是真实的多参数必须在阵列中已过,但可变参数功能自动化和隐藏的进程。

1

[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) 
    { 
     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参数上的行为取决于转换。

1

是的,它们是相同的,因为当你使用elipsis(String ...)调用方法时,它将转换为String数组。

4

this SO discussion

基础类型一个可变参数的方法function(Object... args)的是 function(Object[] args)。 Sun以这种方式添加了可变参数,以保持向后兼容性 。

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

1

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

0

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

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

+1

不确定这是否符合答案或者是否描述了您刚刚遇到的问题。 – yvesmancera 2015-09-15 16:47:02

+0

谢谢yvesmancera – krishna 2015-09-16 11:41:29

+0

我已编辑答案 – krishna 2015-09-16 12:54:40

相关问题