Разница между «реализует» и «все реализованные интерфейсы» в Java API - PullRequest
2 голосов
/ 10 июня 2019

Java-API сообщает мне, какие интерфейсы реализует определенный класс. Но есть два вида информации, и я не совсем уверен, что это значит. Например для класса "TreeSet": https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/TreeSet.html есть эта информация:

All Implemented Interfaces:
Serializable, Cloneable, Iterable<E>, Collection<E>, NavigableSet<E>,     Set<E>, SortedSet<E> 

, а также:

public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable

Теперь в разделе "внедряемые" перечислено меньше интерфейсов, чем в разделе "Все реализованные интерфейсы". Что это значит?

И еще: скажем, я хочу нарисовать UML-диаграмму, которая определяет отношения между Treeset и Set и Collection. Я предполагаю, что Treeset реализует Set и Collection (потому что API говорит об этом, но его нет в списке реализаций, что меня немного смущает ...?). Но в то же время Set также является подынтерфейсом Collection. Итак, будет ли достаточно нарисовать стрелку, которая указывает на связь между двумя интерфейсами, и чем одну стрелку, чтобы указать, что TreeSet реализует Set (но не стрелка для Collection), или мне нужно нарисовать стрелку, указывающую, что TreeSet также реализует Collection? 1011 *

Извините за мой английский. Я надеюсь, что смогу сделать мой вопрос понятным.

Ответы [ 4 ]

4 голосов
/ 10 июня 2019

implements перечисляет непосредственно реализованные интерфейсы, которые являются интерфейсами, явно указанными в предложении implements.

Список всех реализованных интерфейсов может быть длиннее, поскольку интерфейсы, которые класс реализует непосредственноможет расширять другие интерфейсы, которые класс реализует косвенно.

TreeSet непосредственно реализует NavigableSet, но поскольку NavigableSet расширяет SortedSet, что расширяет Set, что расширяет Collection, который расширяетIterable, все эти интерфейсы реализованы косвенно TreeSet, поэтому они перечислены в списке всех реализованных интерфейсов.

Что касается диаграммы UML, я бы нарисовал стрелку, которая указывает«реализует» только между классом и интерфейсами, которые он непосредственно реализует.Косвенно реализованные интерфейсы будут показаны в иерархии непосредственно реализованных интерфейсов.

Например:

Iterable
  ^
  |
Collection
  ^
  |
 Set
  ^
  |
SortedSet
  ^
  |
NavigableSet
  ^
  |
TreeSet
1 голос
/ 10 июня 2019

«Все реализованные интерфейсы» включают в себя те, которые реализованы суперклассами или расширены реализованными интерфейсами (напрямую или нет).

Вот представление, данное иерархией типов Eclipse, которое показывает, куда добавляются другие интерфейсы:

enter image description here

1 голос
/ 10 июня 2019

Список «Все реализованные интерфейсы» сообщает вам об интерфейсах, которые класс реализует напрямую, а также обо всех интерфейсах, от которых эти интерфейсы получены.Так, например, NavigableSet является производным от Set.TreeSet не реализует Set напрямую, но Set реализуется благодаря тому факту, что любой, кто реализует NavigableSet, также реализует Set.

0 голосов
/ 10 июня 2019

Список «Все реализованные интерфейсы» - это не что иное, как список интерфейсов, которые класс TreeSet реализует внутри.Вы всегда можете проверить это, открыв исходный код в вашей IDE (Eclipse, STS и т. Д.), Если вы используете Eclipse IDE, я бы предложил вам открыть интерфейс TreeSet в вашей IDE и проверить это.

public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...