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] 删除。
我来说两句