2013-08-10 6 views
16

Интерфейс Collection имеет несколько методов. Интерфейс List расширяет интерфейс Collection. Он объявляет те же методы, что и интерфейс Collection? Почему это так?Почему интерфейс List расширяет интерфейс Collection?

Например

interface Collection extends Iterable 
{ 
    public abstract int size(); 
public abstract boolean isEmpty(); 
public abstract boolean contains(java.lang.Object); 
public abstract java.util.Iterator<E> iterator(); 
public abstract java.lang.Object[] toArray(); 
public abstract <T extends java/lang/Object> T[] toArray(T[]); 
public abstract boolean add(E); 
public abstract boolean remove(java.lang.Object); 
public abstract boolean containsAll(java.util.Collection<?>); 
public abstract boolean addAll(java.util.Collection<? extends E>); 
public abstract boolean removeAll(java.util.Collection<?>); 
public abstract boolean retainAll(java.util.Collection<?>); 
public abstract void clear(); 
public abstract boolean equals(java.lang.Object); 
public abstract int hashCode(); 
} 

и теми же методами, также присутствуют в интерфейсе списка:

public interface List extends Collection 
{ 
public abstract int size(); 
public abstract boolean isEmpty(); 
public abstract boolean contains(java.lang.Object); 
public abstract java.util.Iterator<E> iterator(); 
public abstract java.lang.Object[] toArray(); 
public abstract <T extends java/lang/Object> T[] toArray(T[]); 
public abstract boolean add(E); 
public abstract boolean remove(java.lang.Object); 
public abstract boolean containsAll(java.util.Collection<?>); 
public abstract boolean addAll(java.util.Collection<? extends E>); 
public abstract boolean removeAll(java.util.Collection<?>); 
public abstract boolean retainAll(java.util.Collection<?>); 
public abstract void clear(); 
public abstract boolean equals(java.lang.Object); 
public abstract int hashCode(); 
} 

ли это требование, чтобы написать эти методы снова в списке, если он уже расширяет интерфейс Collection?

+1

Думаю, только для обеспечения удобочитаемости. –

+0

Где вы это видели? – Oswald

+0

Где вы это читаете? Вы когда-нибудь разбирали файл '.class'? – chrylis

ответ

28

Они переписаны так, что они могут быть задокументированы, чтобы указать, как List уточняет контракт этих методов по сравнению с контрактом, указанным в интерфейсе Collection.

Например, метод add() в List документирован, чтобы указать, что элемент добавлен в конец списка. Это невозможно указать в коллекции, поскольку у коллекции нет начала и конца.

+2

Хороший ответ, особенно на примере контракта 'List.add()'. –

13

Контракты JavaDoc и API несколько меняются или становятся более конкретными, поскольку вы перемещаетесь по наследству по наследству.

Список повторных заявлений этих методов & дает им более конкретный JavaDoc.

+0

Это, вероятно, не то, что имел в виду ОП; он смотрит на разборку (обратите внимание на подпись 'java/lang/Object'), но он скомпонован любым инструментом, который он использует. – chrylis

+0

ну, но мой вопрос: List должен содержать только те методы, реализация которых изменилась или имеет какое-то другое поведение, здесь он написал весь метод Collection, а затем использует коллекцию? – user2602839

+0

Если вы хотите повторно задокументировать методы или изменить/узко/уточнить свой письменный контракт и JavaDoc, вам необходимо повторно объявить их. Итак, есть подпись метода для присоединения JavaDoc. –

6

Просто для удобства.

Same mentioned in Docs

Список интерфейс размещает дополнительные предписания, помимо тех, которые указаны в интерфейсе Collection, по договорам итератора, добавлять, удалять, равно, и методы Hashcode. Объявления для других унаследованных методов также включены здесь для удобства

2

Подписи на toArray методов предполагают, что вы извлекли из этого скомпилированных .class файлов. class file format указывает, что файл .class не повторяет методы, унаследованные от суперинтерфейсов, поэтому я подозреваю, что любой инструмент, который вы использовали для их получения, показывал вам составное представление; методы на самом деле физически отсутствуют на List.

+0

Да, вы правы - модификаторы 'abstract' действительно предлагают его просмотр из декомпилированных файлов классов. Спасибо за понимание! –

2

Коллекция всего лишь предметов.

Список, помимо хранения списка предметов, добавляет информацию о последовательности материала к нему.

Когда вы добавляете товар в коллекцию, вы просто добавляете его. Когда вы добавляете товар в список, вы можете добавить его в позицию n

Когда вы удаляете элемент из коллекции, вы просто удаляете его. При удалении элемента из списка, вы можете удалить в положении п

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

+0

сэр хорошо, мы делаем все то, что вы написали внутри класса, который реализует интерфейс List и интерфейс Collection, но в случае интерфейса, только если мы расширяемся, мы не будем писать тот же самый mathod declaratioin, потому что для reusablity мы расширяем интерфейс коллекции внутри интерфейса List – user2602839

+0

@ user2602839 Что я пытаюсь сказать, повторное объявление этих методов снова в 'List', выдается более конкретное поведение. –

+0

какой тип поведения, если вы увидите метод добавления, тогда он написал как «public abstratct boolean add (E)», тот же метод снова был написан внутри Списка, а также внутри коллекции, и здесь мы нарушаем правило наследования или нет? – user2602839

3

Collection<T> это просто группа пункта. Сам по себе он не имеет больше требований, чем ссылки на многие элементы, являющиеся его членами.

В базовом java-апи есть два основных типа коллекций: List<T> и Set<T>.

List<T> есть дополнительные требования для поддержания определенного порядка (порядок вставки, отсортированный заказ, ...) для всех его предметов. Так что, если вы запрашиваете элемент N, список всегда будет возвращать тот же элемент для N.

Set<T> не предлагает никаких гарантий по заказу, но предлагает гарантию на уникальность предметов. Элемент A не может быть добавлен дважды в Set или будет отображаться только один раз в наборе.

Вы должны ознакомиться с практикой интерфейса «маркер». Serializable является одним из тех, и обычно основным примером является разговор об этом. И List<T> и Set<T> объявлены как таковые, они отмечают коллекцию как та или иную, чтобы сообщить программисту о поведении, которое они могут ожидать от получаемой коллекции.

Для получения хорошего объяснения того, как это лучше, чем использование аннотаций, обратитесь к пункту 37 (глава 6) «Эффективная Java».

И есть также тот факт, что myCollection instanceof MyInterface быстрее, чем myCollection.getClass().isAnnotationPresent(MyAnnotation.class) или myCollection.getClass().getAnnotation(MyAnnotation.class) != null.

1

Прежде всего интерфейс List наследует все методы Collection, поэтому все методы, которые существуют в интерфейсе Collection, будут существовать также в интерфейсе List, но интерфейс List имеет дополнительные методы (проверьте его ur self), который описывает поведение списка

1

Это главным образом из-за целей документации, которые они использовали таким образом.

Например

Collection#retainAll 

Сохраняет только элементы в этом коллекции, которые содержатся в указанном наборе (дополнительная работа).

List#retainAll 

Сохраняет только элементы в этом списке , которые содержатся в указанном наборе (дополнительная работа).

Только для цели java-doc они использовали это. Но некоторые из методов поведения сами по себе изменились.

For ex.add,remove 

Метод удаления

In List, Removes the first occurrence of the specified element from this list, if it is present (optional operation). 

In Collection , Removes a single instance of the specified element from this collection, if it is present (optional operation). 

Через Java документ они должны четко указывать реализации списка упорядочены.

Смежные вопросы