配列はfor-eachループで使用できますが、を実装していませんIterable
。単純に2つの可能性があります。前述のようにメソッドをオーバーロードするか、反復可能なバリアントのみを提供してクライアントに強制的に呼び出すかのいずれかですArrays.asList()
。
配列のオーバーロードも提供する場合は、そのシグネチャを単純な配列からvarargsに変更できます。
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
そして、一般的なvarargsを使用した、最もあいまいな部分:
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の配列を渡すと、面白いことが起こります。
int[] ints = { 1, 2 };
System.out.println(Arrays.deepToString(foo(ints)));
> [[1, 2]]
int[][]
この場合、tsの値は、最初に渡された配列である1つの要素のみを持つint配列( )の配列です。この理由は、intの配列がであるのに対し、anint
はではないObject
(自動ボクシングはここでは役に立ちません)ため、T
typeパラメーターの値はになりint[]
ます。