2011-01-13 32 views
8

thể trùng lặp:
What are the reasons why Map.get(Object key) is not (fully) genericTại sao java.util.Map.get (...) không chung chung?

Phương pháp này và một số phương pháp khác trong giao diện đồ không chung chung. Hầu như bất cứ nơi nào một giá trị khóa được mong đợi như là một tham số, nó chấp nhận Object thay vào đó, cụ thể là remove, get và containsKey.

Bất kỳ ý tưởng nào về lý do họ đưa ra quyết định này. Giả định của tôi là nó đã được thực hiện để hỗ trợ mã di sản, nhưng với tôi, tôi nghĩ đó là một vị trí yếu.

Bất kỳ ai cũng có thể cung cấp cho tôi một lý do cụ thể tại sao nên chấp nhận Object ở đây thay vì KeyType.

+3

Câu hỏi này đã được hỏi nhiều lần trong 6 năm qua. Tôi đề nghị bạn tìm kiếm các câu trả lời hiện có –

+0

Tương tự với loại bỏ, containsValue, containsKey, ... – aioobe

Trả lời

8

Các đối tượng được sử dụng để truy xuất/xóa/kiểm tra sự tồn tại của khóa đã cho không nhất thiết phải cùng loại với đối tượng được sử dụng để lưu trữ nó (= khóa).

Nó cần phải là equal và trả về cùng một khóa hashCode, nhưng không có gì trong thông số nói rằng nó phải cùng loại.

Thực tế này hiếm khi được sử dụng và hầu hết thời gian bạn sẽ truy xuất các giá trị bằng cùng một khóa (hoặc ít nhất là các đối tượng cùng loại) như những cái bạn sử dụng để lưu trữ chúng.

Nhưng vì đó là trường hợp sử dụng được hỗ trợ trong "cũ" HashMap, nó cũng cần được hỗ trợ trong phiên bản generics.

Lưu ý rằng tất cả các phương thức keySet() sử dụng loại cụ thể, vì nó chắc chắn trả về chính xác các đối tượng được sử dụng làm khóa khi put() được gọi.

+0

Ah, rất tốt. Cảm ơn bạn đã trả lời. Tôi cho rằng có một chút ý nghĩa. Tôi đoán bạn có thể tìm kiếm bằng số nguyên một ánh xạ sử dụng đôi như phím ... –

+0

@ Kevin: exampe cụ thể sẽ không hoạt động, bởi vì 'Integer' và' Double' không có tương thích 'equals()' hiện thực. –

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