Trong Java Generics, từ khóa extends
và super
được sử dụng trong ràng buộc wildcard để thể hiện quan hệ giữa các lớp trong một cách linh hoạt và an toàn về kiểu. Chúng được sử dụng trong khai báo của các tham số kiểu để kiểm soát sự chấp nhận của các kiểu dữ liệu dựa trên cấu trúc phân cấp lớp của chúng. Dưới đây là sự khác biệt cơ bản giữa extends
và super
trong context này:
Extends (Giới hạn trên)
extends
được sử dụng để biểu thị rằng một kiểu tham số hoặc wildcard có thể là lớp đã cho hoặc là lớp con của lớp đó (bao gồm cả lớp triển khai một interface, nếuextends
được sử dụng với interface).- Nó giới hạn kiểu tham số để chỉ chấp nhận lớp được chỉ định hoặc các lớp con của nó.
- Điều này giúp đảm bảo rằng bạn có thể đọc từ một cấu trúc dữ liệu với kiểu dữ liệu này an toàn về kiểu.
Ví dụ:
List<? extends Number> list = new ArrayList<Integer>();
Trong ví dụ trên, list
có thể chứa đối tượng của Number
hoặc bất kỳ lớp con nào của Number
(như Integer
, Double
, v.v...), nhưng do bản chất của extends
, bạn chỉ có thể đảm bảo rằng đọc từ list
là an toàn và không thể viết vào list
một cách an toàn về kiểu (ngoại trừ null
).
Super (Giới hạn dưới)
super
được sử dụng để chỉ định rằng một kiểu tham số hoặc wildcard có thể là lớp đã cho hoặc là lớp cha của lớp đó.- Nó giới hạn kiểu tham số để chỉ chấp nhận lớp được chỉ định hoặc lớp cha của nó.
- Điều này giúp đảm bảo rằng bạn có thể viết vào một cấu trúc dữ liệu với kiểu dữ liệu này an toàn về kiểu, nhưng chỉ có thể đảm bảo đọc được giá trị dưới dạng
Object
từ cấu trúc dữ liệu đó.
Ví dụ:
List<? super Integer> list = new ArrayList<Number>();
Trong ví dụ trên, list
có thể chứa Integer
hoặc lớp cha của Integer
(như Number
hoặc Object
). Bạn có thể an toàn viết một Integer
vào list
, nhưng khi đọc từ list
, bạn không thể chắc chắn về kiểu của phần tử mà không ép kiểu, do đó, giá trị được trả về thường được xử lý như là một Object
.
Kết luận
Sự chọn lựa giữa extends
và super
trong generics phụ thuộc vào việc bạn muốn "đọc từ" hay "viết vào" cấu trúc dữ liệu đó, tuân theo nguyên tắc "producer extends, consumer super" (PECS) - "người sản xuất sử dụng extends, người tiêu dùng sử dụng super".
Comments