Không có bản sao của danh sách, chỉ có một bản sao của tham chiếu đến danh sách. Từ khóa cuối cùng không quan trọng. Tuy nhiên, điều quan trọng là một loại thô được sử dụng. Nếu tham số sẽ được sử dụng thay vào đó, trình biên dịch sẽ báo cáo một lỗi:
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)));
}
Điều này có nghĩa, rằng họ đang sử dụng biến trung gian để phá vỡ những thiếu sót của Generics, và để thoát khỏi các thông báo lỗi.
Câu hỏi thú vị là: Tại sao họ không sử dụng một phương pháp chung? Các mã sau đây hoạt động:
public static <T> void swap(List<T> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
Câu trả lời là, rằng phương pháp này tạo ra cảnh báo trong mã cũ gọi phương thức với các loại nguyên liệu:
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);
Dưới đây là các nguồn có liên quan trên Grepcode cho bất cứ ai quan tâm: 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 –
Có gì với downvote? –