尽管数组可以在 for-each 循环中使用,但它们不实现Iterable
. 只有两种可能性,要么重载你所说的方法,要么只提供可迭代的变体并强制客户端调用Arrays.asList()
.
如果您还想提供数组重载,您可以将其签名从简单数组更改为可变参数:
public void foo(String... myStrings){
foo(java.util.Arrays.asList(myStrings));
}
在这种情况下,请注意原始数组和原始包装数组之间的不兼容:
static void foo(int... ints) {}
foo(new Integer[] {1, 2}); // compile error
和:
static void foo(Integer... integers) {}
foo(new int[] { 1, 2 }); // compile error
最晦涩的部分,带有通用可变参数:
static <T> T[] foo(T... ts) {
return ts;
}
如果您传递一个整数数组:
Integer[] integers = { 1, 2 };
System.out.println(Arrays.deepToString(foo(integers)));
> [1, 2]
的值ts
是具有 2 个元素的整数数组:1
和2
。
然而,如果你传递一个原始整数数组,就会发生一件有趣的事情:
int[] ints = { 1, 2 };
System.out.println(Arrays.deepToString(foo(ints)));
> [[1, 2]]
int[][]
在这种情况下,ts 的值是一个只有一个元素的 int 数组 ( ) 数组,也就是最初传递的数组。这样做的原因是 anint
不是一个Object
(自动装箱在这里没有帮助),而一个 int 数组是,所以T
类型参数的值变成int[]
.