2013-04-05 30 views
8

Khi tôi nhìn thấy những tuyên bố ArrayListCó bất kỳ lợi ích trong việc thực hiện một giao diện trong một lớp con mặc dù cha thực hiện cùng một giao diện

class ArrayList<E> extends AbstractList<E> 
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable 

mà thực hiện giao diện List mặc dù ArrayList 's cha AbstractList thực hiện các cùng một giao diện List.

abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

tờ khai tương tự có thể được tìm thấy trên HashMap, LinkedHashMap tờ khai cũng có.

enter image description here

Trong tuyên bố của LinkedHashMap, nó thực hiện giao diện Map chỉ và không phải là giao diện khác được thực hiện bởi lớp cha của nó HashMap.

Vì vậy, có thể có một số lợi ích của việc khai báo như vậy.

Trả lời

6

Không có lợi ích chức năng nào để khai báo lại, nó không ảnh hưởng đến hành vi theo bất kỳ cách nào.

Tôi đoán nó chỉ được thêm vào để làm cho nó rõ ràng hơn mà giao diện được thực hiện.

+0

Nếu làm rõ ràng hơn là lợi ích duy nhất, thì LinkedHashMap thậm chí có thể triển khai các giao diện Cloneable, Serializable. Nhưng nó đã không. –

+2

@CharlesGreenWay Tôi thường sẽ viết "Bản đồ <..> bản đồ = new LinkedHashMap <>()', nhưng hiếm khi 'Cloneable cloneable = new LinkedHashMap <>()' ... một 'LinkedHashMap' chủ yếu là một' Bản đồ', mặc dù nó thực hiện các giao diện khác. –

+0

Cảm ơn @Heuster vì đã giải thích. Điều này cũng sẽ cho khả năng tương thích (ví dụ) Nếu trong tương lai, HashMap không thực hiện Bản đồ (mặc dù điều này có thể không xảy ra), sau đó LinkedHashMap vẫn có thể thực hiện Bản đồ –

3

Điều này được thực hiện chỉ cho mục đích tài liệu, để làm cho nó ngay lập tức rõ ràng cho người dùng của lớp giao diện lớp thực hiện.

Khoản dư thừa implements khoản không tạo sự khác biệt cho trình biên dịch.

0

Vâng, theo cách này, bạn phải triển khai phương thức List<E> khi bạn tạo phân lớp thành AbstractList và bạn cũng có thể sử dụng ArrayList làm AbstractList.

+1

Câu hỏi là lý do tại sao 'ArrayList' thực hiện rõ ràng' Danh sách', mặc dù nó hoàn toàn không bằng cách mở rộng 'AbstractList'. Đó là cho rõ ràng chỉ, như chỉ ra bởi Keppil và NPE. –

+0

@Heuster Bạn đúng; nó không có tác dụng thực sự ở đây. – Pietu1998

1

Có. Nó có thể đã bị bỏ qua. Nhưng do đó nó ngay lập tức nhìn thấy rằng nó là một danh sách. Nếu không, một nhấp chuột bổ sung thông qua mã/tài liệu sẽ được yêu cầu. Tôi nghĩ đó là lý do - sự rõ ràng.

Và để thêm những gì Joeri Hendrickx nhận xét - đó là nhằm mục đích hiển thị rằng ArrayList triển khai Danh sách. AbstractList trong toàn bộ hình ảnh chỉ là để thuận tiện và để giảm trùng lặp mã giữa các triển khai Danh sách.

Tham chiếu: Why does ArrayList have "implements List"?

1

Hoàn toàn không cần thiết. Tôi sẽ không làm điều đó chút nào.

Hiện chưa rõ lý do tại sao họ làm điều đó. Nhưng bây giờ rõ ràng đó là một sai lầm, vì mọi người đều ngạc nhiên bởi nó khi họ lần đầu tiên nhận thấy sự dư thừa kỳ lạ này.

0

ArrayList<T>AbstractList<T> triển khai List<T> cho các mục đích khác nhau.

  • List<T>lập những gì là cần thiết cho một lớp học để trở thành một danh sách.
  • ArrayList<T> triển khai List<T> như một phần của việc xác định giao diện riêng của mình. Đây là điều cần thiết cho những gì ArrayList<T> là.
  • ArrayList<T> mở rộng AbstractList<T> như một phần của riêng việc thực hiện riêng của mình. Điều này là hoàn toàn tùy chọn: người ta có thể đã triển khai ArrayList<T> từ đầu mà không kế thừa AbstractList<T> và lớp học sẽ hoạt động theo cùng một cách.
  • AbstractList<T> được dùng làm lớp cơ sở cho các triển khai khác List<T>. Thay vì thiết lập một giao diện, nó theo sau hiện có. AbstractList<T> 's thực hiện List<T> là không cần thiết, tất cả mọi thứ sẽ biên dịch và chạy mà không có nó chỉ giống nhau. Tuy nhiên, kế thừa List<T> cho phép trình biên dịch Java phát hiện ra sự khác biệt tiềm năng giữa các phương thức giao diện và phương thức của AbstractList<T>, do đó, ý tưởng rất tốt cho AbstractList<T> để triển khai giao diện List<T>.
Các vấn đề liên quan