×

Sự khác biệt giữa super và extends trong Generics?

Trong Java Generics, từ khóa extendssuper đượ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 extendssuper 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ếu extends đượ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 extendssuper 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