是字符串 [] 和字符串.(Var-args)在内部工作时相同


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

上面的代码无法编译!编译器说这些是重复的方法。所以使用字符串数组或字符串变量参数的意思完全一样?

它们如何在内部实施?

它们实际上是相同的,只是编译器不接受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

来自这个 SO 讨论

可变参数方法function(Object... args)的基础类型是 function(Object[] args) .孙以这种方式添加了瓦拉格以保存 向后兼容性。

所以,正如其他答案所说,是的,它们是相同的。

String... aaa就像

拥有String[] aaa一样。

我假设第二个函数后面的分号是一个错字......

是的,是一样的。

您可以阅读这篇文章:

必须在数组中传递多个参数仍然是正确的,但 varargs 功能可以自动执行并隐藏该过程。

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

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

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

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

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

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

看看这个:

请参阅何时在 Java 中使用 varargs?

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

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

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

在调用方法时它不关心返回类型,它会考虑方法名称,参数数量和参数类型以及参数顺序.在这里您指定一个具有相同名称的方法相同的参数.bcoz在var arg的情况下,如果我们调用具有2个参数的方法,则将执行相同的方法, 如果我们调用具有 3 个参数的方法,它将调用相同的方法。在这里,如果我们调用某物(字符串 [] a( 和某物(字符串...AAA(相同的方法将称为.bcoz,我们可以用var-arg替换数组,然后会出现混淆,应该调用该方法。那么方法歧义就会被遮挡。这就是为什么它显示重复方法的原因。

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

最新更新