Đây thực sự là một vấn đề. Nếu ai đó gọi số remove(o)
và o
không phải là E
, thì đó thường là lỗi lập trình cố gắng xóa nhầm điều. Loại kiểm tra không thành công để bảo vệ chúng tôi khỏi lỗi.
Mặc dù IDE tốt (IntelliJ) có thể phát hiện các vấn đề như vậy và cảnh báo chúng tôi, nhà thiết kế API phải cung cấp chữ ký chính xác hơn để sử dụng kiểm tra loại trình biên dịch. (IDE lừa ở đây - nó biết ý nghĩa của Set.remove()
vì nó là một API chuẩn. IDE sẽ không cung cấp trợ giúp tương tự cho API tùy chỉnh)
Đối với API truy vấn như , chấp nhận tham số không phải là E
một sai lầm tầm thường. Vì vậy, chúng ta có thể có cả hai
boolean contains(Object o);
boolean contains2(E o);
Đối với đột biến API như remove()
, nó gây tranh cãi liệu có nên chấp nhận một phi E
tranh cãi.Tuy nhiên, cuộc tranh luận sẽ là tranh luận, vì thực tế của xóa bỏ - thực sự không có lựa chọn nào khác ngoài chấp nhận lập luận không phải E và im lặng về nó. Tuy nhiên, chúng tôi có thể có hai phương pháp
boolean remove(Object o);
boolean remove2(E o);
Trong hầu hết các trường hợp, người lập trình có thể gọi contains2/remove2
để đảm bảo an toàn hơn.
liên quan: http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic –
bản sao có thể có của [Tại sao không phải Java Các bộ sưu tập loại bỏ các phương thức chung chung?] (Http://stackoverflow.com/questions/104799/why-arent-java-collections-remove-methods-generic) – PhoneixS