2013-08-09 28 views
8

Từ Effective Java Chương 5 (generics):Loại tham số vs wildcard vô biên

// Two possible declarations for the swap method 
public static <E> void swap(List<E> list, int i, int j); 
public static void swap(List<?> list, int i, int j); 

nào trong hai tờ khai này là một lợi thế, và tại sao? Trong API công khai, thứ hai là tốt hơn bởi vì nó đơn giản hơn. Bạn chuyển vào danh sách - bất kỳ danh sách nào - và phương thức hoán đổi các phần tử được lập chỉ mục. Không có tham số kiểu cần lo lắng. Theo quy tắc, nếu tham số kiểu chỉ xuất hiện một lần trong khai báo phương thức, hãy thay thế nó bằng ký tự đại diện.

Tôi không hiểu, tại sao tùy chọn thứ hai đơn giản hơn cho khách hàng của API của tôi? Tôi có thể chuyển các tham số tương tự cho phương thức thứ nhất và thứ hai. Ngoài ra, thứ hai yêu cầu phương pháp trợ giúp để chụp ký tự đại diện. Ai đó có thể giải thích lý do tại sao thứ hai được đề nghị? Cảm ơn!

+0

câu trả lời có thể có: http://stackoverflow.com/questions/6231973/difference-between-list-list-listt-liste-and-listobject?rq=1 –

Trả lời

10

Câu hỏi thường gặp về Generics Java là một nguồn tuyệt vời để trả lời các loại câu hỏi này và câu hỏi "ký tự đại diện so với chung" được thảo luận theo chiều dài trong Which one is better: a generic method with type parameters or a non-generic method with wildcards? và Nghiên cứu điển hình tiếp theo.

Angelika Langer đi đến kết luận:

Kết luận: Trong tất cả các ví dụ này nó là chủ yếu là một vấn đề của hương vị và phong cách cho dù bạn thích chung hoặc phiên bản wildcard. Thường có sự cân bằng giữa tính dễ triển khai (phiên bản chung thường dễ thực hiện hơn) và độ phức tạp của chữ ký (phiên bản ký tự đại diện có ít tham số kiểu hơn hoặc không có thông số nào).

đơn giản hơn phương pháp chữ ký -> dễ hiểu hơn (ngay cả khi cả hai đều sử dụng cùng một cách) -> tốt trong API công cộng (cân bằng: thực hiện phức tạp hơn)

Nhưng toàn bộ điều là một vấn đề trọng lượng nhẹ và theo kinh nghiệm của tôi thì sự nhất quán trong toàn bộ API quan trọng hơn nhiều so với phong cách bạn sử dụng.

+2

Vui lòng cải thiện câu trả lời của bạn thay vì chỉ đánh dấu nó là một liên kết câu trả lời. Ít nhất sao chép nội dung liên quan của liên kết trong câu trả lời của bạn dưới dạng trích dẫn (sử dụng ký hiệu '>' ở đầu đoạn văn). –

Các vấn đề liên quan