public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
Cuộc gọi đến phương thức này sẽ không đánh dấu chọn. Tôi thậm chí không thể truyền thông số như sau:Tại sao Danh sách <Number> không phải là loại phụ của Danh sách <Object>?
wahey((List<Object>) new LinkedList<Number>());
Từ nghiên cứu của tôi, tôi đã thu thập được lý do không cho phép loại này an toàn. Nếu chúng tôi được phép làm các việc trên, sau đó chúng ta có thể có những điều sau đây:
List<Double> ld;
wahey(ld);
Bên trong phương pháp wahey, chúng ta có thể thêm một số Strings vào danh sách đầu vào (như các tham số duy trì một tham chiếu List<Object>
). Bây giờ, sau khi gọi phương thức, ld đề cập đến một danh sách có loại List<Double>
, nhưng danh sách thực tế chứa một số đối tượng String!
Điều này có vẻ khác với cách thông thường mà Java hoạt động mà không có generics. Ví dụ:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
Điều chúng ta đang làm ở đây về cơ bản là giống nhau, ngoại trừ việc này sẽ vượt qua kiểm tra biên dịch và chỉ thất bại trong thời gian chạy. Phiên bản có Danh sách sẽ không biên dịch.
Điều này dẫn tôi tin rằng đây hoàn toàn là một quyết định thiết kế liên quan đến các hạn chế loại trên generics. Tôi đã hy vọng nhận được một số ý kiến về quyết định này?
liên quan (không phải là bản sao chính xác, mặc dù câu trả lời chính xác về cơ bản giống nhau): http: // stackoverflow.com/questions/251298/why-is-someclass-super-t-not-equivalent-to-someclasst-in-java-generic-types – Kip
Thuật ngữ nghệ thuật là ** hiệp phương sai ** - Tôi đề cập đến điều này bởi vì nó làm cho nó dễ dàng hơn cho bạn để tìm kiếm nó, bao gồm trên Stack Overflow (nếu bạn muốn xem những gì tôi đã nói về nó - trong ngữ cảnh của C#, nhưng nó cũng áp dụng cho Java - tìm kiếm [người dùng hiệp phương sai: 95810], chẳng hạn). –
Một dàn diễn viên đôi như 'wahey ((Danh sách