2012-06-24 18 views
13

thể trùng lặp:
Java.util.HashMap — why HashMap extends AbstractMap and implement Map?Tại sao HashMap triển khai Bản đồ nếu nó mở rộng AbstractMap?

Trong java để thực hiện HashMap<K,V> chúng ta cần phải thực hiện Map<K,V>.

Tuy nhiên khi tôi gỡ lỗi nhiều hơn trong các lớp java có vẻ như .... java định nghĩa HashMap lớp như sau.

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

Đồng thời tôi thấy public abstract class AbstractMap<K,V> thực hiện Map<K,V> nó cũng thực hiện các giao diện Map<K,V>.

Nếu lớp trừu tượng triển khai giao diện thì lý do đằng sau việc triển khai Map<K,V> ở mức HashMap là gì?

Theo hiểu biết của tôi HashMap lớp học có tất cả các phương pháp được kế thừa từ AbstractMap có thể bị ghi đè bởi HashMap theo yêu cầu.

+3

Có thể khi nó được thiết kế trong Java 1.2 lớp cần thiết để triển khai giao diện ngay cả khi siêu lớp đã triển khai IMO. –

+0

Xem [this] (http://stackoverflow.com/questions/11028542/why-does-atomicinteger-implements-serializable). Nó chỉ ra tình huống tương tự –

+1

Có ... nó phải được đóng như một bản sao. –

Trả lời

1

Tôi tin rằng lý do đằng sau đây là một lớp trừu tượng trong Java không cần khai báo/triển khai tất cả các phương thức trong giao diện. Do đó

public interface MyInterface{ 
    void a(); 
    void b(); 
    void c(); 
} 

việc triển khai giao diện trừu tượng sau đây hợp lệ.

public abstract class AbstractClass implements MyInterface { 
    public void a() {} 
    public void c() {} 
    public void d() {} 
} 

Vì vậy tôi tin rằng để được rõ ràng về HashMap thực hiện các phương pháp không được thực hiện bởi lớp trừu tượng nó được hiển thị để thực hiện các giao diện Map trong khi nó hoàn toàn không bắt buộc phải làm như vậy bởi vì bất kỳ việc thực hiện các nhu cầu lớp trừu tượng để thực hiện tất cả các phương pháp hoặc trong lớp trừu tượng hay lớp cơ sở có nguồn gốc .. như vậy trong ví dụ trên một thực hiện hợp lệ đến lớp trừu tượng là

public class MyClass extends Abstract{ 
     public void a() {} 
     public void c() {} 
     public void b() {} //if you dont implement this, compile error 
     public void d() {} 
    } 

mà bạn có thể viết lại như sau quá:

012.
public class MyClass extends Abstract implements MyInterface { 
     public void a() {} 
     public void c() {} 
     public void b() {} 
     public void d() {} 
    } 
+4

Không có lý do để làm điều này, nếu một lớp trừu tượng thực hiện một giao diện nó không phải thực hiện tất cả các phương thức, lớp "không trừu tượng" đầu tiên mở rộng lớp trừu tượng __must__ phải triển khai các phương thức "không được triển khai". –

+0

chính xác là quan điểm của tôi .. – Baz1nga

6

Có thể chỉ có ở đó để làm cho mọi thứ rõ ràng hơn. Về cơ bản, bạn có thể xem trực tiếp từ mã của lớp đơn đó HashMap triển khai giao diện Map. Có, nó đã mở rộng AbstractMap, nhưng đó có thể chỉ được coi là chi tiết triển khai.

Không có gì sai khi triển khai lại giao diện. Điều đó không thay đổi cách mã được biên dịch, nhưng nó chắc chắn sẽ giúp bởi vì bạn thấy nó ngay lập tức. Bạn không cần phải leo lên cấp bậc của lớp hoặc tải tài liệu API trước.

3

"Bản đồ thực hiện" là tùy chọn và thường ở đó để giúp mọi người đọc mã HashMap triển khai các phương thức giao diện của Map cũng như các phương thức trừu tượng của AbstractMap.

6

Trong trường hợp cụ thể này, nó hoàn toàn dành cho mục đích tài liệu; I E.để làm rõ cho người đọc biết rằng này là việc thực hiện Map. Tôi khá chắc chắn có chi phí không đáng kể trong bit dự phòng này.

(Và, có, sự hiểu biết của bạn là chính xác.)

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