【问题标题】:Is a variable length argument treated as an array in Java?Java中的可变长度参数是否被视为数组?
【发布时间】:2014-06-03 19:15:52
【问题描述】:

据我了解,array 包含固定数量的元素,variable length argument 接受与您传递的参数一样多的参数(相同类型)。但它们是一样的吗?我可以将一个传递到另一个预期的地方吗?

【问题讨论】:

  • 你试过了吗?写几行Java并不需要太多。答案是:是的,您也可以将数组传递给可变参数方法,它将用作参数列表。但是,您不能将变量参数传递给声明为接受数组的方法。
  • @ErwinBolwidt 您的评论很有帮助。谢谢。

标签: java arrays variadic-functions


【解决方案1】:

是的,如果您有一个带有 varargs 参数的方法,如下所示:

public void foo(String... names)

你这样称呼它:

foo("x", "y", "z");

然后编译器只是将其转换为:

foo(new String[] { "x", "y", "z"});

names 参数的类型是String[],可以像任何其他数组变量一样使用。请注意,它可能仍然是null

String[] nullNames = null;
foo(nullNames);

请参阅documentation for varargs 了解更多信息。

意味着可变参数可以与数组互换——你仍然需要声明方法来接受可变参数。例如,如果您的方法声明为:

public void foo(String[] names)

那么第一种调用方式不会编译。

【讨论】:

  • 正如 ErwinBolwidt 所提到的,我们不能在期望数组的地方传递可变数量的参数。但是,主要方法呢?我们可以将 main 声明为 main(String... args) 对吗?你能澄清一下吗?
  • @Phoenix:是的,你可以——当然,你可以很容易地自己测试。
【解决方案2】:

一个简单的测试表明它们是相同的:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}

输出:

string1
string2
string3
string4
string5
string6

【讨论】:

  • 但Java数组的大小必须预先设置。这会将允许的参数数量限制为该数组的大小。在我看来,变量参数列表必须是 ArrayList
【解决方案3】:

它们是相同的,在创建可变参数方法时,JVM 在内部使用数组。所以你可以像对待数组一样对待 vararg 参数,例如使用增强的 for 循环

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}

并像这样调用它,甚至传递一个数组

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});

查看这个漂亮的article 以获得进一步的解释。

【讨论】:

  • 文章链接无效
  • 已修复,谢谢 :-)
猜你喜欢
  • 2012-01-25
  • 2014-07-27
  • 2011-01-26
  • 1970-01-01
  • 2011-11-11
  • 2017-02-06
  • 2011-09-30
相关资源
最近更新 更多