首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java变长参数与数组,简单的语法糖?

Java变长参数与数组,简单的语法糖?
EN

Stack Overflow用户
提问于 2015-08-30 19:02:22
回答 2查看 2K关注 0票数 6

我正在当地一所社区学院选修一门数据结构和算法课程。这门课程的教科书是丹尼尔·梁的Java编程导论,第10版。这本书本身是相当坚实的。

在处理Java.util.Arrays时,梁提到了Java的“可变长度”参数。他写道(第265页):

Java将可变长度参数视为数组。可以将数组或可变数量的参数传递给可变长度参数。当调用具有可变参数数的方法时,Java会创建一个数组并将参数传递给它。

一个例子是:

代码语言:javascript
复制
public static void (int... toes) {
    //... some code
}

然而,梁从来没有解释过变长参数的起源和优势.如果,正如梁所说,变长参数被“转换”为数组,它们的优势是什么?是否有由可变长度参数促进的软件设计模式或工程目标?

换句话说,下面没有提供的代码片段提供了什么:

代码语言:javascript
复制
public static void (int[] toes) { // ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-30 19:32:57

在Java中,varargs是在调用方法时创建数组的语法糖。例如,这两个调用是等价的:

代码语言:javascript
复制
void foo(String... args) { ... }

foo("hello", null, "world", xyz);  // Java 1.5+
foo(new String[]{"hello", null, "world", xyz});  // All versions of Java

Varargs没有使任何新的可能性(根据语法糖的定义),但它减少了冗长,并使一些构造更易于实现。例如,我最喜欢的vararg用法包括:PrintStream.printf()String.format()Method.invoke()

varargs的其他良好应用:

代码语言:javascript
复制
// This one is in the Java standard library
Collections: void addAll(Collection<? super T> c, T... elements);

// Custom examples
int max(int... nums);
void doOperation(File x, String y, SomeEnum options...);

此外,Java的varargs使语言与C、Python、JavaScript和其他语言中的vararg支持保持一致。因此,如果经常重复的设计(如max())对varargs最有效,那么Java不再是需要更丑的实现的奇怪语言。

票数 5
EN

Stack Overflow用户

发布于 2015-08-30 19:19:41

“.”您正在讨论的参数称为瓦拉格

需要注意的一些差异:

  • varargs可以不传递参数(基本上被忽略)、null或不确定数量的参数,而数组参数必须传递数组或null。
  • varargs 必须是方法的最后一个参数,而对于数组参数则不重要。这是因为varargs的特殊属性,这可能是您发布的两件事之间最显著的区别:

最后参数类型之后的三个句点表明,最终参数可以作为数组传递或作为参数序列传递。

来源

例如,这个方法:

代码语言:javascript
复制
public void myMethod(String... args) {}

可以使用以下任何一种方法调用:

代码语言:javascript
复制
String[] myStrings = {"a", "b", "c"};
myMethod(myStrings);
myMethod("a", "b", "c");

有关何时使用varargs的良好解释,请参见

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32300100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档