Подтвердить что ты не робот

Резервированная реализация интерфейса List в ArrayList.java

Возможный дубликат:
Почему ArrayList имеет "реализует список" ?

Я новичок в java. Я пытался увидеть иерархию интерфейса коллекции. Я обнаружил, что подпись AbstractList.java похожа на

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

Он реализует интерфейс List. Но если вы посмотрите на подпись дочернего класса ArrayList.java, это выглядит как

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

Если вы видите родительский класс, уже реализован интерфейс List, тогда почему дочерний класс снова реализует один и тот же интерфейс (Список).

Есть ли конкретные причины или требования для этого

4b9b3361

Ответ 1

Есть ли конкретные причины или требования для этого

Я так не думаю. Удаление второго List<E> ничего не изменило бы в отношении компилятора.

Мои две гипотезы:

  • Это там по историческим причинам. Однако я не могу найти никаких доказательств, подтверждающих это.
  • Он включен для целей документирования, чтобы сделать его сразу понятным, чем ArrayList<E> is-a List<E> (это, наверное, самое важное, что нужно знать о ArrayList).

Ответ 2

Я понятия не имел, каков был ответ, поэтому я немного поработал. Оказывается, это для ясности.

Да. Его можно было бы опустить. Но при этом сразу видно, что это список. В противном случае дополнительный клик по коду/ потребуется документация. Я думаю, что причина - ясность.

И добавить то, что прокомментировал Joeri Hendrickx - это для цели показывая, что ArrayList реализует List. Абстрактный список в целом изображение просто для удобства и для уменьшения дублирования кода между Реализация списков.

Почему ArrayList имеет "реализует список" ?

Ответ 3

Возможно, только для целей документации, чтобы дать понять людям которые хотят использовать ArrayList.

Это действительно избыточно, поскольку суперкласс класса AbstractList из ArrayList уже реализует интерфейс List.

из Java Ranch

Другая причина может быть:

// 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 methods, that subclass will 
// not compile. 

Я нашел здесь.