Как интерфейс может переопределить метод класса Object? Почему интерфейс «Коллекция» переопределяет метод equals (Object o) и метод hashCode () класса 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. Однако хотелось бы знать, какова цель переопределения (т. Е. Объявления) методов класса объекта с помощью интерфейсов, в любом случае класс, реализующий этот интерфейс, будет неявно расширять класс объекта, поэтому этот класс может переопределить требуемые методы класса объекта. ?
Я добавил этот запрос к существующему вопросу. Спасибо.




Вкратце: прямой суперинтерфейс — это тот, который расширяет интерфейс (родительский); суперинтерфейсы включают в себя прямой и любой суперинтерфейс этого (родительский, прародительский, прапрародительский, ...)
Термины суперинтерфейс и прямой суперинтерфейс определены в Спецификации языка Java 9.1.3. Суперинтерфейсы и субинтерфейсы:
Если указан пункт
extends, ...
Указанные типы интерфейса являются прямыми типами суперинтерфейса объявляемого интерфейса. ...
Один интерфейс является прямым суперинтерфейсом другого интерфейса, если первый интерфейс назван одним из типов прямого суперинтерфейса второго интерфейса.Отношение суперинтерфейса является транзитивным замыканием прямого отношения суперинтерфейса. Интерфейс
Iявляется суперинтерфейсом интерфейсаK, если верно одно из следующих условий:
I— это прямой суперинтерфейсK.- Где
J— прямой суперинтерфейсK,I— суперинтерфейсJ, применяя это определение рекурсивно.
Iterable, как он может переопределить метод класса объекта (например, equals())Как указано в вопросе, JLS 9.2. Участники интерфейса утверждают:
- Если интерфейс не имеет прямых типов суперинтерфейса, то интерфейс неявно объявляет
public abstractметод-членmс сигнатуройs, типом возвращаемого значенияrи предложением throwst, соответствующим каждому публичному методу экземпляраmс сигнатуройs, типом возвращаемого значенияrи предложением throwstзаявлено вObject...
предыдущий пункт в JLS объясняет:
- Члены, унаследованные от любых прямых типов суперинтерфейса (§9.1.3).
Поскольку Iterable является прямым суперинтерфейсом Collection, Collection наследует все члены, включая методы, от Iterable. А Iterable не имеет прямого суперинтерфейса, поэтому к нему относится первый пункт и он будет объявлять методы Object.
Большое спасибо! Однако хотелось бы знать, какова цель переопределения (т. Е. Объявления) методов класса объекта с помощью интерфейсов, в любом случае класс, реализующий этот интерфейс, будет неявно расширять класс объекта, поэтому этот класс может переопределить требуемые методы класса объекта?