Hãy nói rằng tôi đã có một phương pháp như thế này:
public List<? extends T> filterOutNulls(List<T> input) { ...
Cấp, không phải là chữ ký tốt nhất trên thế giới, nhưng vẫn hoàn toàn hợp pháp. Điều gì sẽ xảy ra nếu tôi đã chuyển một số List<String>
cho phương thức đó? Theo chữ ký, nó trả về một List<? extends String>
. Nếu Java không cho phép loại đó, nó sẽ không thể sử dụng phương thức này cho List<String>
(hoặc ít nhất, nó sẽ không thể sử dụng giá trị trả về).
secondarily, cú pháp extends
vẫn còn hữu ích trong trường hợp này, vì List<String>
và List<? extends String>
có những hạn chế khác nhau - đặc biệt, bạn không thể thêm bất cứ điều gì nhưng một null
đen để List<? extends String>
. Thỉnh thoảng tôi sẽ sử dụng ? extends
để biểu thị rằng bộ sưu tập là chỉ đọc (vì chỉ T
mà bạn có thể chuyển là null
) và ? super
để biểu thị chỉ ghi (vì bạn chỉ có thể nhận được T
s là Object
). Đây không phải là hoàn toàn đánh lừa bằng chứng (bạn vẫn có thể gọi loại bỏ phương pháp, vượt qua trong null
s, downcast, vv) nhưng phục vụ như một lời nhắc nhở nhẹ nhàng về cách bộ sưu tập có thể có nghĩa là để được sử dụng.
Tại sao bạn nghĩ điều đó nên? – jason
@ L4zy Khi tôi cố gắng sử dụng phương pháp tôi nhận được cảnh báo ...Ngoài ra, bạn cũng có thể chuyển mã 'Uncompilable source code - Loại không hợp lệ:' –