2010-08-09 32 views
9

Nhìn vào mã nguồn JDK cho LinkedHashMap, tôi nhận thấy rằng lớp này được khai báo là:LinkedHashMap chữ ký

public class LinkedHashMap<K,V> 
     extends HashMap<K,V> 
     implements Map<K,V> 
    {... 

tại sao dự phòng "implements Map<K,V>" (từ HashMap đã thực hiện bản đồ)? Tôi không thể tưởng tượng đây là lỗi đánh máy ...

Cảm ơn.

+0

Tình huống tương tự với HashMap và AbstractMap –

Trả lời

12

Tôi cho rằng đó là một cách khác để nói

Không có vấn đề gì giao diện HashMap cụ (ngay bây giờ hoặc trong tương lai), lớp này nên thực hiện giao diện bản đồ.

Nếu ai đó chịu trách nhiệm về HashMap quyết định không nên triển khai giao diện Map, trình biên dịch sẽ cảnh báo người duy trì LinkedHashMap rằng nó không còn triển khai giao diện Bản đồ như dự định.

Tất nhiên nó là ngớ ngẩn trong trường hợp cụ thể này (HashMap rõ ràng sẽ luôn luôn là một Bản đồ), nhưng tình huống tương tự có thể được hưởng lợi từ (và đã đưa ra) quy ước như vậy.

1

Dường như quy ước kiểu/mã: LinkedHashSet có chữ ký tương tự. Có lẽ nó chỉ để nhấn mạnh việc sử dụng giao diện. So sánh với C++, nơi thực hành tốt để viết "ảo" với tất cả các chức năng ảo, ngay cả khi chúng đã hoàn toàn ảo.

+0

Cũng như LinkedList. Tôi đoán nó làm cho nó dễ dàng hơn để làm việc ra những giao diện được thực hiện. –

0

Có thể là lỗi trên phần bộ mã hóa.

Họ cũng có thể muốn sử dụng giao diện rõ ràng. Kể từ khi tuyên bố nó hai lần không có tác hại ngoài đột quỵ quan trọng thêm, tôi không có một vấn đề với nó.

0

Đoán của tôi là cho phép LinkedHashMap cung cấp triển khai tùy chỉnh các phương thức được khai báo trong giao diện Bản đồ. Bằng cách này, nó sẽ không kế thừa tất cả các triển khai từ HashMap.

+2

Nó sẽ không kế thừa các phương pháp từ HashMap anyway .. vì nó sẽ ghi đè lên chúng. – aioobe

0

Nó làm cho ý định rõ ràng hơn, vì vậy rõ ràng đây là bản đồ triển khai thực hiện, với hành vi cụ thể, tình cờ xảy ra bằng cách mở rộng HashMap, do đó có thể được sử dụng ở một số nơi, nơi của một HashMap.

3

Đó là mã cổ. Cho đến một số điểm xung quanh JDK 1.1.6 hay như vậy, Javadoc không hiển thị các giao diện được kế thừa, do đó, nó là phong tục hoặc thực sự cần thiết để nhắc lại chúng trong các lớp dẫn xuất để có được Javadoc hoạt động đúng. Chúng được giới thiệu trong JDK 1.2 nhưng đã có sẵn trước đó như là một add-on cho 1.1.x.