2015-12-23 16 views
6

Tôi hiện đang đọc Java Generics và tôi hơi bị kẹt khi nói đến Ký tự đại diện.Java Generics - Lớp một lớp con của chính nó?

Tôi đã được cấp phương pháp này từ lớp Collections:

public void <T> copy(List<? super T> dest, List<? extends T> src) { 
    for(int i = 0; i < src.size(); i++) { 
     dest.set(i, src.get(i)); 
    } 
} 

Tôi đã sau đó được cho biết rằng người ta có thể gọi phương thức như thế này:

List<Object> objs = new ArrayList<Object>(); 
List<Integer> ints = new ArrayList<Integer>(); 
Collections.copy(objs, ints); 

Khi tham số loại có được để lại cho trình biên dịch để xác định, cuốn sách nói rằng trình biên dịch chọn tham số kiểu là Integer.

Nhưng làm cách nào có thể?

Nếu được lấy là Số nguyên, điều này có nghĩa là trong khai báo phương thức -
List<? extends T> sẽ dịch sang List<Integer extends Integer>.

Đây có phải là nhầm lẫn hoặc có các quy tắc khác nhau liên quan đến Generics không? Tôi đã googled xung quanh và phần lớn các kết quả nói rằng một lớp không thể là một lớp con của chính nó.

+0

Câu trả lời của Nizet là chính xác tất nhiên và nếu bạn chỉ thiếu điểm mà anh ấy giải thích thì tất cả đều tốt. Tuy nhiên, generics có thể trở nên rất khó hiểu rất nhanh và nếu bạn cảm thấy rằng bạn cần một lời giải thích rộng rãi hơn về trường hợp cụ thể này tôi có thể cố gắng để cung cấp cho một. – user1803551

Trả lời

8

Không, đó không phải là lỗi.

? extends Integer có nghĩa là: bất kỳ lớp nào hoặc mở rộng Số nguyên (hoặc triển khai Số nguyên, nếu Số nguyên là giao diện).

Điều tương tự cũng xảy ra với ? super Integer, có nghĩa là: bất kỳ lớp nào là Số nguyên hoặc là siêu lớp hoặc siêu giao diện của Số nguyên.

+0

Cảm ơn bạn đã xóa thông tin đó. Sẽ chấp nhận câu trả lời khi tùy chọn có sẵn. – user3650602

Các vấn đề liên quan