Возьмем пример:
public interface Testerface {
default public String example() {
return "Hello";
}
}
public class Tester implements Testerface {
@Override
public String example() {
return Testerface.super.example() + " world!";
}
}
public class Internet {
public static void main(String[] args) {
System.out.println(new Tester().example());
}
}
Достаточно просто напечатать Hello world!
. Но скажу, что я делал что-то еще с возвращаемым значением Testerface#example
, например, инициализируя файл данных и возвращая чувствительное внутреннее значение, которое не должно покидать класс реализации. Почему Java не разрешает модификаторы доступа по методам интерфейса по умолчанию? Почему они не могут быть защищены/приватными и потенциально повышены подклассом (аналогично тому, как класс, который расширяет родительский класс, может использовать более видимый модификатор для переопределенного метода)?
Общее решение переходит к абстрактному классу, однако в моем конкретном случае у меня есть интерфейс для перечислений, поэтому здесь не применяется. Я предполагаю, что это было либо упущено, либо потому, что оригинальная идея интерфейсов заключается в том, что они являются "контрактом" доступных методов, но я полагаю, что хочу получить информацию о том, что происходит с этим.
Я читал "Почему "final" не разрешен в методах интерфейса Java 8?, в котором говорится:
Основная идея метода по умолчанию: это метод интерфейса с реализацией по умолчанию, а производный класс может обеспечить более конкретную реализацию
И мне кажется, что видимость не нарушит этот аспект вообще.
Как и связанный с ним вопрос, поскольку похоже, что проблема была закрыта, авторитетный ответ был бы оценен в этом вопросе, а не на основе мнения.