Mimo że tablice mogą być używane w pętli for-each, nie implementują one Iterable
. Są po prostu dwie możliwości, albo przeciąż metodę, jak już wspomniano, albo po prostu podaj tylko wariant iterowalny i zmuś klienta, aby zadzwonił pod numer Arrays.asList()
.
W przypadku, gdy chcesz również przeciążenie tablicy, można zmienić swój podpis z prostej tablicy do varargs:
public void foo(String... myStrings){
foo(java.util.Arrays.asList(myStrings));
}
W takim przypadku, strzeżcie się niezgodności między prymitywnych tablic i tablic prymitywny-Wrapper:
static void foo(int... ints) {}
foo(new Integer[] {1, 2}); // compile error
oraz:
static void foo(Integer... integers) {}
foo(new int[] { 1, 2 }); // compile error
A najbardziej niejasny część z varargs Generic:
static <T> T[] foo(T... ts) {
return ts;
}
Jeśli przekazać tablicę liczb całkowitych:
Integer[] integers = { 1, 2 };
System.out.println(Arrays.deepToString(foo(integers)));
> [1, 2]
Wartość ts
jest tablicą liczb całkowitych z 2 elementów: 1
i 2
.
Jeśli jednak przekazać tablicę prymitywnych wskazówki, zabawna rzecz się dzieje:
int[] ints = { 1, 2 };
System.out.println(Arrays.deepToString(foo(ints)));
> [[1, 2]]
W tym przypadku, wartość ts jest tablicą int tablic (int[][]
) tylko z jednego elementu, który jest pierwotnie przekazaną tablicą. Powodem jest to, że int
nie jest Object
(autoboxing nie pomaga tutaj), podczas gdy tablica ints jest, więc wartość parametru typu T
staje się int[]
.
Dzięki, myślę, że wciąż próbowałem przekonać java, że głęboko w jego sercu był python. – BostonJohn
Haha, nie klikaj tutaj - przepraszam. :) –
Witamy w świecie pełnym pisania. Java jest oparta na zasadzie WET zamiast DRY (jak w Write Everything Twice zamiast Dont Repeat Yourself). – akuhn