Nie ma kopii listy, istnieje tylko kopia odwołania do listy. Ostatnie słowo kluczowe nie jest ważne. Jednak ważne jest, aby użyć typu surowego. Jeżeli parametr byłyby wykorzystywane zamiast, kompilator zgłosi błąd:
public static void swap(List<?> list, int i, int j) {
// ERROR: The method set(int, capture#3-of ?) in the type List<capture#3-of ?>
// is not applicable for the arguments (int, capture#4-of ?)
list.set(i, list.set(j, list.get(i)));
}
Oznacza to, że są one za pomocą zmiennej pośredniej do obejścia braków leków generycznych, a pozbyć się komunikatu o błędzie.
Interesujące pytanie brzmi: dlaczego nie używają ogólnej metody? Poniższy kod działa:
public static <T> void swap(List<T> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
Odpowiedź jest, że metoda ta daje ostrzeżenia w starym kodzie wywołanie metody z surowego typów:
List list = ...;
// WARNING: Type safety: Unchecked invocation swap2(List, int, int)
// of the generic method swap2(List<T>, int, int) of type Swap
Collections.swap(list, 0, 1);
Oto odnośne źródło na Grepcode dla wszystkich zainteresowanych: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.swap%28java.util.List%2Cint%2Cint%29 –
Co to jest ze spadkiem? –