Как происходит наследование если оба реализуемых интерфейса объявляют один и тот же метод?

В том случае, когда объявления полностью идентичны, в класс, реализующий эти интерфейсы определяет требуемый метод.

В том случае, если методы возвращают разные типы, тот все зависит от самих типов.

Как известно, начиная с 5 версии Java переопределение ковариантно по отношению к типу возвращаемого значения. Таким образом, в наследнике тип выдаваемого результата может являться наследником. Например, в super классе метод должен возвращать Number, то в переопределённом классе он может возвращать Integer.

Когда возвращаемые типы не наследуются один от другого, как Srting и Integer, то в этом случае данный класс реализовать не получиться.

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

Для методов throws, выбрасывающих исключения, работает правило ковариантности. Но следует учитывать, что исключений имеющих примитивные тип не существует. Кроме этого, для исключений, не являющихся наследниками друг друга есть вариант, когда исключения полностью отсутствуют.

interface IntegerResult { Integer foo(); }
interface IntResult { int foo(); }
interface NumberResult { Number foo(); }
interface ThrowsException { void foo() throws Exception; }
interface ThrowsIOException { void foo() throws IOException; }
 
class ResultCovariance implements IntegerResult, NumberResult {
  @Override
public Integer foo() { return 42; }
}
 
class Primitive implements IntegerResult, IntResult {
  @Override
public int foo() { return 42; } // Реализовать этот класс без ошибки невозможно
}
 
class ThrowsCovariance implements ThrowsException, ThrowsIOException {
  @Override
public void foo() throws IOException {} // Общий наследник Exception и IOException.
}

Если метод объявлен как default, то есть имеет реализацию, то невозможно определить какой именно метод нужно вызвать, и компилятор выдаёт ошибку «inherits unrelated defaults».

Данная ошибка появляется даже если обе реализации методов идентичны. Такая ошибка может встретиться даже при работе со стандартными библиотеками Java. При реализации List и Set данную ошибку вызовет метод spliterator().

Поэтому, такой метод должен быть переопределён и для него должна быть определена реализация от конкретного родителя. Для чего можно использовать следующий синтаксис: MyBase.super.doSmth(). Пример его использования приведён ниже.

interface Button {
  default void clickO {
    System.out.println("Button is clicked");
    	}
}
 
interface Link {
  default void click() {
    System.out.println("Link is clicked");
      }
}
 
interface Clickable {
  void click();
}
 
class MyControl implements Button, Link {
  @0verride
  public void click() {
    Button.super.click(); // Явно вызываем нужный метод
      }
}
 
abstract class MyButton implements Clickable, Button { 
  // Ключевое слово abstract не избавляет от ошибки
}

Peer-to-peer собеседования

AI Sprints — обучение профессиям с ИИ

Практика собеседований с менторами и другими студентами. Реальные вопросы по Kotlin, Android и Backend

  • Живые собеседования: практикуйте интервью с менторами и коллегами-студентами
  • Реальные вопросы: база вопросов по Kotlin, Android, Backend и QA
  • Фидбек: обратная связь после каждого собеседования — знаете, что улучшить
Посмотреть подготовку к собеседованиям →
🎁 Бесплатно · 5 дней

AI Challenge — собери чат-бота за 5 дней

Бесплатный марафон по AI-инжинирингу. Cursor + OpenAI, 60 минут в день — без опыта в программировании. К пятнице у вас будет рабочий чат-бот с памятью в браузере.

  • Практика с первого дня, без теории «в стол»
  • Готовый проект в портфолио к концу недели
  • Старт в любой день — учитесь в своём темпе
Начать бесплатно →
Peer-to-peer собеседования AI Sprints — обучение профессиям с ИИ
Посмотреть подготовку к собеседованиям →

Бесплатная диагностика с сениор разработчиком

Запишитесь на консультацию — перезвоним в рабочие часы

Или свяжитесь удобным способом

Вам также может быть интересно

Узнать подробнее
Курс AI Sprints

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Курс AI Sprints - Глубокое <strong>обучение Android разработке с 0 до получения оффера</strong>. Только персональная практика с гарантией получения продуктового опыта.
Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Практикум по Kotlin - Изучение Котлин <strong>с 0 для профессиональной разработки</strong>. Личный ментор и разбор кода задач через git-flow.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Бесплатные уроки по Kotlin разработке - <span>Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.</span>
Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Onboarding в разработку - <span>Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь</span>
Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Обучающий Kotlin телеграм бот (с тестами) - Ваш основной <span>инструмент для изучения основ языка.</span> Бесплатные тесты и практика внутри.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Бесплатные уроки  по Android разработке - Самостоятельное <span>обучение разработке Андроид приложений.</span> Понятные видеоуроки с разжеванными примерами.
Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Курс по UI/Unit тестированию - Для ручных тестировщиков, которые <span>готовы осваивать автотесты</span> с использованием актуального стека технологий. [в разработке]
Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Обучающий Android телеграм бот (с тестами) - Бесплатные <span>теоретические тесты для самопроверки.</span> А также информер на практических спринтах по Android.
Узнать подробнее
ИИ-ментор код-ревью и голосовые собесы
Открыть