【发布时间】:2013-08-25 20:00:07
【问题描述】:
所以我一直试图找出 Java 中 String... 的意义。据我了解,它与 String[] 大致相同,但我在此处或 Google 上找不到任何有关它的信息。
谁能告诉我它是什么以及类似的东西的正确用法? (假设我有一个带有参数myMethod(String... args) { ... }
谢谢!
【问题讨论】:
-
寻找“variadic java”。
所以我一直试图找出 Java 中 String... 的意义。据我了解,它与 String[] 大致相同,但我在此处或 Google 上找不到任何有关它的信息。
谁能告诉我它是什么以及类似的东西的正确用法? (假设我有一个带有参数myMethod(String... args) { ... }
谢谢!
【问题讨论】:
就类型而言,此语法确实与String[] 相同。但是,它允许调用者通过指定可变数量的String 参数来隐式构造一个数组:
myMethod("a", "b", "c");
myMethod(); // Empty array is also allowed
myMethod("a", "b");
这种语法的一个限制是,这样的参数只能出现在方法参数列表的末尾。
【讨论】:
String[]。
myMethod(String[]) 相同,调用与myMethod(new String[] {"a", "b", "c"}) 相同。
myMethod(new String[] {"a", "b", "c"}); 编译器很好地匹配它。当有另一个重载方法只是缺少最后一个形式参数时,使用显式空数组有时是让编译器调用方法的可变参数版本的唯一方法,或者解决其他不明确的方法重载(最后一个可变参数参数的类型不同) )。
这意味着myMethod 接受零个或多个String 参数。例如,参见here。在Java Language Specification 中,这称为variable arity 参数:
方法或构造函数的最后一个形参是特殊的:它可能是一个可变参数,由类型后面的省略号表示。
如果最后一个形参是可变参数,则该方法是可变参数方法。否则,它是一个固定的arity方法。
JLS 还在gruesome detail 中描述了当存在可变参数时如何匹配方法签名。
【讨论】:
... 表示该方法支持 var-args 即变量(数量)参数。
所以,你可以打电话给你的myMethod()
myMethod(); // or
myMethod(str1); // or
myMethod(str1, str2); // and so on
使用相同的方法签名myMethod(String... str)。当声明具有多个参数的 var-arg 方法时,var-arg 参数必须在所有其他普通方法参数之后成功。
在方法内部,所有传递的参数都可以作为一个数组访问,该数组具有与参数相同的引用名称。所以,你实际上可以在这里使用str.length。
该功能非常灵活。您甚至可以将String[] 传递给它。但是,反过来是不正确的。采用数组的方法不会接受单个字符串。
【讨论】: