2010-02-11 28 views
25

Tôi hiểu các get and put principle cho bộ sưu tập: nếu một phương pháp có trong một bộ sưu tập mà nó sẽ viết một loại T, tham số phải là Collection<? super T>, trong khi nếu nó sẽ đọc gõ T từ, tham số phải là Collection<? extends T>.Java generics: Collections.max() chữ ký và so sánh

Nhưng có thể một người nào đó xin vui lòng giải thích Collections.max() chữ ký:

public static <T> T max(Collection<? extends T> coll, 
        Comparator<? super T> comp) 

Đặc biệt tại sao nó Comparator<? super T> thay vì Comparator<? extends T>?

Trả lời

65

Chú thích của Josh Bloch PECS hữu ích tại đây. Nó là viết tắt của:

Nhà sản xuất extends, Consumer super

Điều này có nghĩa rằng khi một kiểu tham số được truyền đến một phương pháp sẽ sản xuất trường hợp của T (họ sẽ được lấy ra khỏi nó một cách nào đó), ? extends T nên được sử dụng, vì bất kỳ trường hợp nào của một lớp con của T cũng là một số T.

Khi một kiểu tham số được truyền đến một phương pháp sẽ tiêu thụ trường hợp của T (họ sẽ được chuyển đến nó để làm một cái gì đó), ? super T nên được sử dụng bởi vì một thể hiện của T hợp pháp có thể được thông qua bất kỳ phương pháp chấp nhận một số siêu kiểu của T. Ví dụ: Comparator<Number> có thể được sử dụng trên Collection<Integer>. ? extends T sẽ không hoạt động, bởi vì Comparator<Integer> không thể hoạt động trên Collection<Number>.

Edit: Để làm rõ hơn một chút về get/đặt (sản phẩm/tiêu thụ):

public T something(); 
    ^

Trên đây là một phương pháp sản xuất T.

public void something(T t); 
        ^

Ở trên là phương pháp tiêu thụ T.

"Nhà sản xuất extends, Người tiêu dùng super" áp dụng cho cách phương thức đối tượng được tham số được chuyển đến sẽ sử dụng đối tượng đó. Trong trường hợp của Collections.max(), các mục sẽ được truy xuất từ ​​Collection, do đó, nó là một nhà sản xuất. Các mục đó sẽ được chuyển làm đối số cho phương thức trên Comparator, vì vậy nó là một người tiêu dùng.

0

Trình so sánh cần có thể lấy một đối số là T.

+0

Tôi đoán có lẽ tôi không hoàn toàn hiểu được nguyên tắc get/put sau đó ... ??? –

+6

Tôi khuyên bạn nên đọc chương Java hiệu quả thảo luận về "PECS", sau đó. Và suy nghĩ về nó theo cách này: nếu tôi yêu cầu bạn sắp xếp một danh sách của đôi, và đã cho bạn một Comparator để làm điều đó với, làm thế nào bạn sẽ cảm thấy về điều đó? –

+0

Bạn có thể mở rộng câu trả lời của mình không? Trong khi câu trả lời có thể rõ ràng đối với các lập trình viên java nâng cao, nó đòi hỏi phải đọc lại câu hỏi để hiểu đầy đủ những gì bạn đang nói. Tôi biết đây có thể là một trong các câu trả lời trước của bạn, nhưng nó xuất hiện ở phần Đánh giá bài đăng có chất lượng thấp. - [Từ đánh giá] (https://stackoverflow.com/review/low-quality-posts/11445740) – Ferrybig

1

Bộ so sánh tiêu thụ một cặp Ts và tạo một int. Bộ sưu tập tạo ra Ts mà bộ so sánh tiêu thụ.

Siêu tiêu thụ, mở rộng sản xuất.

Liên quan đến nguyên tắc nhận và đặt, nhận sản xuất và đặt tiêu thụ.