Разница между «Суперинтерфейсом интерфейса» и «Прямым суперинтерфейсом интерфейса» в Java?

Как интерфейс может переопределить метод класса Object? Почему интерфейс «Коллекция» переопределяет метод equals (Object o) и метод hashCode () класса Object?

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#equals(java.lang.Object).

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#hashCode()

Чтобы переопределить метод определенного класса, нам нужно расширить этот класс (т.е. концепция наследования появляется на картинке). Означает ли это, что интерфейсы в java расширяют (т.е. наследуют) класс объекта?

Мое понимание :

Как мы знаем, интерфейс в java не расширяет класс объекта, однако для каждого общедоступного метода в классе объекта существует неявный абстрактный и общедоступный метод, объявленный в каждом интерфейсе, который не имеет прямых суперинтерфейсов. Это стандартная спецификация языка Java, в которой говорится следующее:

«Если интерфейс не имеет прямых типов суперинтерфейса, то интерфейс неявно объявляет общедоступный абстрактный метод-член m с сигнатурой s, возвращаемым типом r и выдает предложение t, соответствующее каждому публичному методу экземпляра m с сигнатурой s, возвращаемым типом r, и выбрасывает предложение t, объявленное в Object, если интерфейсом явно не объявлен абстрактный метод с той же сигнатурой, тем же типом возвращаемого значения и совместимым предложением throws».

(Ссылка: https://docs.oracle.com/javase/specs/jls/se17/html/jls-9.html)

Но интерфейс «Коллекция» имеет суперинтерфейс (т.е. Iterable), то как он может переопределить метод класса объекта? поскольку это противоречит приведенному выше определению.

Есть ли разница между «прямым суперинтерфейсом интерфейса» и «суперинтерфейсом интерфейса»? потому что в приведенном выше определении упоминается слово «прямой суперинтерфейс», а Iterable — это суперинтерфейс коллекции.

(Ссылка: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html)

Редактировать:

Большое спасибо! @user16320675. Однако хотелось бы знать, какова цель переопределения (т. Е. Объявления) методов класса объекта с помощью интерфейсов, в любом случае класс, реализующий этот интерфейс, будет неявно расширять класс объекта, поэтому этот класс может переопределить требуемые методы класса объекта. ?

Большое спасибо! Однако хотелось бы знать, какова цель переопределения (т. Е. Объявления) методов класса объекта с помощью интерфейсов, в любом случае класс, реализующий этот интерфейс, будет неявно расширять класс объекта, поэтому этот класс может переопределить требуемые методы класса объекта?

Anand Pandey 01.05.2023 18:08

Я добавил этот запрос к существующему вопросу. Спасибо.

Anand Pandey 01.05.2023 18:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разница между «Суперинтерфейсом интерфейса» и «Прямым суперинтерфейсом интерфейса»

Вкратце: прямой суперинтерфейс — это тот, который расширяет интерфейс (родительский); суперинтерфейсы включают в себя прямой и любой суперинтерфейс этого (родительский, прародительский, прапрародительский, ...)

Термины суперинтерфейс и прямой суперинтерфейс определены в Спецификации языка Java 9.1.3. Суперинтерфейсы и субинтерфейсы:

Если указан пункт extends, ...
Указанные типы интерфейса являются прямыми типами суперинтерфейса объявляемого интерфейса. ...
Один интерфейс является прямым суперинтерфейсом другого интерфейса, если первый интерфейс назван одним из типов прямого суперинтерфейса второго интерфейса.

Отношение суперинтерфейса является транзитивным замыканием прямого отношения суперинтерфейса. Интерфейс I является суперинтерфейсом интерфейса K, если верно одно из следующих условий:

  • I — это прямой суперинтерфейс K.
  • Где J — прямой суперинтерфейс K, I — суперинтерфейс J, применяя это определение рекурсивно.

Интерфейс «Коллекция» расширяется Iterable, как он может переопределить метод класса объекта (например, equals())

Как указано в вопросе, JLS 9.2. Участники интерфейса утверждают:

  • Если интерфейс не имеет прямых типов суперинтерфейса, то интерфейс неявно объявляет public abstract метод-член m с сигнатурой s, типом возвращаемого значения r и предложением throws t, соответствующим каждому публичному методу экземпляра m с сигнатурой s, типом возвращаемого значения r и предложением throws t заявлено в Object ...

предыдущий пункт в JLS объясняет:

  • Члены, унаследованные от любых прямых типов суперинтерфейса (§9.1.3).

Поскольку Iterable является прямым суперинтерфейсом Collection, Collection наследует все члены, включая методы, от Iterable. А Iterable не имеет прямого суперинтерфейса, поэтому к нему относится первый пункт и он будет объявлять методы Object.


Другие вопросы по теме