Java varargs方法参数列表与数组

kevinarpe:

Varargs:

public static void foo(String... string_array) { ... }

单数组参数:

public static void bar(String[] string_array) { ... }

Java 1.6似乎接受/拒绝以下内容:

String[] arr = {"abc", "def", "ghi"};
foo(arr);  // accept
bar(arr);  // accept
foo("abc", "def", "ghi");  // accept
bar("abc", "def", "ghi");  // reject

假设以上内容是正确的,为什么不总是使用varargs而不是单个数组参数呢?似乎免费增加了呼叫者的灵活性。

如果有,专家可以共享内部JVM的差异吗?

谢谢。

彼得·土耳其语:

数组从Java的开始就出现了,而varargs是最近才添加的。因此,许多旧代码仍然很高兴地使用数组。

还要注意,使用显式数组参数调用通用vararg方法可能会静默地产生与预期不同的行为:

public <T> void foo(T... params) { ... }

int[] arr = {1, 2, 3};

foo(arr); // passes an int[][] array containing a single int[] element

因此,除了需要大量的工作并没有明显的好处之外,用varargs替换遗留数组参数并不总是可取的。

更不用说您不能这样做的情况,因为方法参数列表中的数组后面还有另一个参数:

public void foo(String[] strings, String anotherParam) { ... }

重新排序参数可以从技术上解决此问题,但是这会破坏客户端代码。

更新:有效的Java 2nd。版本42:使用varargs明智地更详细说明了这一点,并举了一个具体的示例:Arrays.asList()在Java5中进行了改装,使其具有vararg参数,这在 无意中破坏了许多现有代码 ,使用此(现在已过时)惯用法打印时可能会导致意外数组:

System.out.println(Arrays.asList(myArray));

Update2:仔细检查了源,并说原始类型的数组(例如)发生了问题int[]在varargs之前,代码如下:

int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };
System.out.println(Arrays.asList(digits));

会产生编译错误,因为只有引用类型的数组可以转换为List由于使用了varargs并进行了改造asList,因此上面的代码在编译时不会发出警告,并且意外的结果类似于"[[I@3e25a5]"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据Java的多参数列表过滤数据?

Java的泛型是不适用的参数列表<OBJECT>

在Java中强制用户填充varargs参数的好方法

Java警告:Varargs方法可能会导致来自不可修改的varargs参数的堆污染

有没有一种方法可以自动格式化Java代码中的长参数列表,以便每个参数列表都位于单独的行上?

用单个null参数调用Java varargs方法?

Java未检查:varargs参数的未检查通用数组创建

参数列表中的Java数组初始化

Java整数列表

在Java中,对super()参数列表中的静态方法的调用是有效的。为什么?

Java:类型安全性:为varargs参数创建A的通用数组

Java构造函数中的长参数列表

Java中是否有任何varargs数组构造方法?

Java解压参数列表

Java + JSF-在bean中构造数组/列表方法时出错,合并了2个参数

如何在Java中将长参数列表重构为参数对象?

Java错误-实际参数和形式参数列表的长度不同

Java“ while循环”变量在参数列表中声明

在参数列表中声明的Java“ for循环”变量

Java的for循环 参数列表中声明的变量

将泛型和泛型数组作为参数传递的可变长度参数列表-Java

将“传递引用”传递给与抽象方法的参数列表匹配的方法时,java 8如何内部评估?

Clojure:如何将Varargs扩展为Java方法列表

Java:不带逗号的参数列表

Java,使用参数列表进行构造函数调用?

Java构造函数:实际参数和形式参数列表的长度不同

Java RegEx-匹配参数列表

在 Java 中如何计算一系列数字以找到产品,即传递给使用可变长度参数列表的方法

具有单个空参数的 Java varargs 方法