2012-12-20 1 views
13

Powiel możliwe:
Why does ArrayList have “implements List”?Redundant implementacja interfejsu List w ArrayList.java

Jestem nowy Java Starałem się zobaczyć hierarchię interfejsu zbierającego. Okazało się, że podpis AbstractList.java jest jak

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

Realizuje interfejs listy. Ale jeśli spojrzeć na podpis klasy dziecięcej ArrayList.java wygląda

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

Jeśli spojrzeć klasa dominująca jest już wdrożony interfejs List dlaczego klasa dziecko ponownie realizacji tego samego interfejsu (listy).

Czy istnieje konkretny powód czy wymóg za tym

Odpowiedz

8

Czy istnieje konkretny powód czy wymóg za tym

Nie sądzę. Usunięcie drugiego List<E> nie zmieniłoby absolutnie niczego w odniesieniu do kompilatora.

Moje dwie hipotezy:

  1. Jest tam ze względów historycznych. Jednak nie mogę znaleźć żadnych dowodów na poparcie tego.
  2. Jest on dołączony do celów dokumentacyjnych, aby od razu było jasne, niż, List<E> (jest to prawdopodobnie najważniejsza rzecz, którą należy wiedzieć o ArrayList).
+1

Ja również próbował znaleźć odpowiedź z moich nauczycieli i rówieśników i doszli do wniosku, że dokumentacja i zmniejszenie dodatkowego kliknięcia jest głównym powodem nadmiarowej realizacji interfejsu List. –

0

prawdopodobnie tylko dla celów dokumentacyjnych, aby było jasne dla osób którzy chcą używać ArrayList.

Jest to w istocie zbędne, ponieważ nadklasa AbstractList w ArrayList implementuje już interfejs List.

z Java Ranch

Innym powodem może być:

// This class captures common code shared by both the ArrayList and LinkedList. 
// An abstract class is a good way to provide a partially implemented class, or 
// a partial implementation of an interface. Notice that the header of this 
// class claims to implement the List interface, but the file doesn't write 
// all of the methods. 
// 
// Java allows this file to compile because it knows that the abstract class 
// must be extended to complete it. If a subclass of AbstractList doesn't 
// implement all the rest of the List interface's methods, that subclass will 
// not compile. 

znalazłem here.

3

Nie miałem pojęcia, jaka jest odpowiedź, więc zrobiłem trochę badań. Okazuje się, to dla jasności.

Tak. Mogło zostać pominięte. Ale od razu widać, że jest to lista. W przeciwnym razie wymagane byłoby dodatkowe kliknięcie dokumentacji kodu/ .Myślę, że to jest powód - jasność.

I dodać, co skomentował Joeri Hendrickx - jest to do celów pokazujące, że ArrayList implementuje List. AbstractList w całym obrazie służy jedynie uproszczeniu i zmniejszeniu powielania kodu między implementacjami list o numerach .

Why does ArrayList have "implements List"?