Чтобы объяснить (возможно, несколько ошибочную) метафору - подумайте о LinkedList
как о листе бумаги. Подумайте о назначении Queue
как покрытии всего, кроме небольшой части этого листа бумаги, который показывает, что это Queue
.
Если вы назовете метод Queue
, он по-прежнему будет делать такие вещи, как обычно, как, например, LinkedList
, так как это то, что является листом бумаги.
Учитывая, что большая часть его покрыта, вы не можете видеть это LinkedList
, все, что вы можете увидеть, что это Queue
, так что вы можете вызывать только методы Queue
на него.
Весь документ все еще существует - вы можете просто удалить покрытие, которое было бы синонимом для его возврата в LinkedList
, что позволило бы вам снова вызвать любой метод LinkedList
.
Теперь немного более технические детали:
кстати LinkedList
«нормально будет» делать вещи, которые я упоминал выше, я имею в виду LinkedList
всегда связанный список, даже если вы его назначили к Queue
- он не начинает вдруг использовать массив в качестве базовой реализации, поскольку ArrayDeque
будет (который также реализует Queue
) или что-то еще.
Queue
не на самом деле нужно быть FIFO (см the docs) (если это должно было быть, LinkedList
также должны быть), поэтому LinkedList
бы совсем немного свободы в этом отношении, так что давайте продолжать это объяснение с использованием Deque
- у него есть методы для поддержки добавления и удаления либо спереди, либо сзади.
Поскольку LinkedList
реализует Deque
, ему необходимо реализовать функцию addFirst
. Основываясь на документах, функция addFirst
должна добавить к передней части Deque
, и действительно, с LinkedList
она добавит переднюю часть LinkedList
(в то время как передняя часть LinkedList
не должна быть передней частью Deque
, взглянув на методы Deque
, реализованные в LinkedList
, мы видим, что передняя часть Deque
является передней частью LinkedList
, и все методы добавляют/удаляют с одной из сторон, делают это с правильной стороны).
Теперь важный хотя и несколько запутанной нота - LinkedList
может, например, осуществлять Deque
и иметь addFirst
, не делать то, что он должен - он может просто, например, напечатать некоторые произвольный текст. В этом языке ничего не существует, так как, насколько это касается компилятора, для реализации Deque
просто требуется, чтобы вы определили кучу методов - не предусмотрено, что эти методы должны делать. Что касается Java API и любой подходящей библиотеки, то следует с уверенностью предположить, что каждый класс, реализующий интерфейс, будет соответствовать тому, что утверждает этот интерфейс, но просто имейте в виду, что нет ничего, что помешает ему не соответствовать когда дело доходит до более затененных библиотек или менее опытных программистов.
двутавровой nterestings вопрос об интерфейсах полокоть http://stackoverflow.com/questions/1686174/when-should-one-use-interfaces http://stackoverflow.com/questions/1913098/what-is- the-difference-between-an-interface-and-abstract-class/1913185 # 1913185 – Narkha
Здесь 'Queue q' является * ссылкой * в очередь. Эта ссылка может указывать на любой подкласс или реализацию 'Queue' –
[Это должно быть хорошо прочитано] (http://stackoverflow.com/q/383947/2024761). – SudoRahul