Реализация супер и суб интерфейсов как в классе (класс 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)?
Ответы
Ответ 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