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