2009-11-17 38 views

Trả lời

34

Họ phơi bày các giao diện khác nhau và hợp đồng cho phương pháp này.

Khai báo đầu tiên phải trả về bộ sưu tập có loại phần tử giống với lớp đối số. Trình biên dịch sẽ nhập loại N (nếu không được chỉ định). Vì vậy, hai câu sau đây hợp lệ khi sử dụng khai báo đầu tiên:

Collection<Integer> c1 = getThatCollection(Integer.class); 
Collection<Double> c2 = getThatCollection(Double.class); 

Khai báo thứ hai không khai báo mối quan hệ giữa đối số Kiểu tập hợp đã trả về cho lớp đối số. Trình biên dịch giả định rằng họ không liên quan, vì vậy khách hàng sẽ phải sử dụng các loại trở lại như Collection<? extends Number>, bất kể những gì các đối số là:

// Invalid statements 
Collection<Integer> c1 = getThatCollection(Integer.class); // invalid 
Collection<Double> c2 = getThatCollection(Double.class); // invalid 
Collection<Number> cN = getThatCollection(Number.class); // invalid 

// Valid statements 
Collection<? extends Number> c3 = getThatCollection(Integer.class); // valid 
Collection<? extends Number> c4 = getThatCollection(Double.class); // valid 
Collection<? extends Number> cNC = getThatCollection(Number.class); // valid 

Khuyến nghị

Nếu thực sự có một mối quan hệ giữa loại giữa đối số kiểu trả về và đối số đã truyền, tốt hơn là sử dụng khai báo đầu tiên. Mã máy khách sạch hơn như đã nêu ở trên.

Nếu mối quan hệ không tồn tại, thì tốt hơn hết là tránh tuyên bố thứ hai. Có một kiểu trả về với một ký tự đại diện bị ràng buộc buộc khách hàng sử dụng các ký tự đại diện ở khắp mọi nơi, vì vậy mã khách hàng trở nên lộn xộn và không thể đọc được. Joshua Bloch nhấn mạnh rằng bạn nên Avoid Bounded Wildcards in Return Types (trang trình bày 23). Trong khi các ký tự đại diện bị ràng buộc trong các kiểu trả về có thể hữu ích là một số trường hợp, thì sự xấu xí của mã kết quả nên, IMHO, ghi đè lên lợi ích.

+3

+1 cho một lời giải thích rõ ràng về sự khác biệt. Phân biệt nhỏ - Tôi nghĩ bạn đi quá xa trong việc giả định người đầu tiên luôn là lựa chọn tốt hơn - tôi muốn nói "không cần phải nói" sự lựa chọn tốt hơn sẽ phụ thuộc vào ngữ cảnh. –

+0

@Steve Cảm ơn! Tôi đã thêm một lời giải thích tại sao câu lệnh thứ hai là để tránh. – notnoop

+0

+1 Câu trả lời thú vị! – Stephan

-3

Trong trường hợp cụ thể này, không. tuy nhiên tùy chọn thứ hai linh hoạt hơn vì nó cho phép bạn trả về một bộ sưu tập chứa các phần tử của một kiểu khác (mặc dù nó cũng là một số) so với kiểu chứa tham số thu thập.

dụ bê tông:

Collection<? extends Number> getRoot(Class<? extends Number> number){ 
    ArrayList<Integer> result=new ArrayList<Integer>(); 
    result.add(java.util.Math.round(number); 
    return result) 
} 
Các vấn đề liên quan