Подтвердить что ты не робот

Реализация супер и суб интерфейсов как в классе (класс A реализует SuperInterface, SubInterface)

interface A {

    public void doSomething();
}

interface B extends A {

    public void doSomethingElse();
}

public class AClass implements A, B {

    public void doSomething() {}

    public void doSomethingElse() {}

}

Почему Java разрешает такое объявление? Какая польза от реализации обоих интерфейсов, когда одна и та же вещь может быть достигнута путем реализации SubInterface (B)?

4b9b3361

Ответ 1

Я думаю, что на вопрос "почему" могут ответить только разработчики Java.

Одна из причин может заключаться в том, что она позволяет дооснащать extends A до B, не нарушая существующих классов, которые уже реализуют оба.

Другой причиной использования этой конструкции может быть немедленная очистка конечного пользователя AClass, что класс реализует как A, так и B. Это обсуждается в Резервная реализация интерфейса List в ArrayList.java

Ответ 2

Это просто удобство. Трудно отследить, что такое структура интерфейса, и для программиста было бы обременительным отслеживать все это. Кроме того, из-за недопустимости избыточных интерфейсов ничего хорошего не может быть: реализация интерфейса несколько раз может быть неизбежна. Например:

interface A { ... }
interface B extends A { ... }
interface C extends A { ... }
public class AClass implements B, C { ... }

В этом случае A "реализуется" дважды, но это не проблема. Это просто означает, что AClass должен реализовать каждый метод, объявленный в A, B и C.

Ответ 3

Если бы это была ошибка, добавление базового интерфейса в существующий публичный интерфейс было бы нарушением изменений.
(если клиентский код имеет класс, который уже реализует оба интерфейса)

Ответ 4

1) Почему бы не реализовать A дважды избыточно, но не приводит к путанице.

2) интерфейс B может быть изменен (и может больше не расширяться A).  AClass все равно будет реализовывать A и B