Những điều này được biết, về mặt lý thuyết loại, như sai, với <? extends T>
là một ký hiệu đồng biến, và <? super T>
là một ký hiệu ngược biến. Giải thích đơn giản nhất là ?
có thể được thay thế bằng bất kỳ loại nào mở rộng T
trong ký hiệu đồng biến, và ?
có thể được thay thế bằng bất kỳ loại nào mà số T
kéo dài trong biến thể ngược lại.
Sử dụng đồng và phương sai là khó khăn hơn nhiều so với lần đầu tiên có vẻ như, đặc biệt là do phương sai "chuyển đổi" tùy thuộc vào vị trí.
Ví dụ đơn giản sẽ là lớp chức năng. Giả sử bạn có hàm A
và trả về một số B
. Các ký hiệu chính xác cho nó sẽ là để nói rằng A
là contra-biến thể và B
os đồng biến thể.Để hiểu rõ hơn trường hợp này, hãy xem xét phương thức - hãy gọi nó là g
- nhận hàm giả thuyết lớp này, trong đó f được cho là nhận được Arc2D
và trả lại Shape
.
Bên g
, f
này được gọi là đi qua một Arc2D
và giá trị trả về được sử dụng để khởi tạo một Area
(mà hy vọng một Shape
).
Bây giờ, giả sử rằng số f
bạn vượt qua nhận được bất kỳ Shape
và trả lại Rectangle2D
. Vì số Arc2D
cũng là số Shape
, sau đó g
sẽ không gặp lỗi khi chuyển số Arc2D
đến f
và kể từ số Rectangle2D
cũng là Shape
, sau đó nó có thể được chuyển đến hàm tạo của Area
.
Nếu bạn cố gắng đảo ngược bất kỳ phương sai nào hoặc hoán đổi các loại dự kiến và thực tế trong ví dụ đó, bạn sẽ thấy nó không thành công. Bây giờ tôi không có thời gian để viết mã này, và Java của tôi khá gỉ ở mức nào đó, nhưng tôi sẽ xem những gì tôi có thể làm sau - nếu không ai đủ tốt để làm điều đó trước.
Nguồn
2010-02-22 11:42:06
Java hiệu quả là rất tốt, nhưng tôi vẫn không có ấn bản thứ hai (( – Roman
@Roman bạn có thể tải xuống chương về Generics từ liên kết tôi đã thêm :-) –
Cảm ơn, tôi sẽ đọc nó. Có ai khác có 'chương mẫu' có sẵn miễn phí không? – Roman