Почему «final» не разрешен в интерфейсных методах Java 8?

Одной из самых полезных функций Java 8 являются новыеdefault методы на интерфейсах. По сути, есть две причины (могут быть и другие), почему они были введены:

Предоставление фактических реализаций по умолчанию. Пример:Iterator.remove()С учетом эволюции JDK API. Пример:Iterable.forEach()

С точки зрения разработчика API, мне бы хотелось иметь возможность использовать другие модификаторы в методах интерфейса, например,final, Это было бы полезно при добавлении вспомогательных методов, предотвращающих «случайные» переопределения при реализации классов:

interface Sender {

    // Convenience method to send an empty message
    default final void send() {
        send(null);
    }

    // Implementations should only implement this method
    void send(String message);
}

Вышесказанное уже является обычной практикой, еслиSender были классом:

abstract class Sender {

    // Convenience method to send an empty message
    final void send() {
        send(null);
    }

    // Implementations should only implement this method
    abstract void send(String message);
}

Сейчас,default а такжеfinal явно противоречат ключевым словам, но само ключевое слово по умолчаниюне был бы строго обязателен, поэтому я предполагаю, что это противоречие является преднамеренным, чтобы отразить тонкие различия между"методы класса с телом" (только методы) и"методы взаимодействия с телом" (методы по умолчанию), то есть различия, которые я еще не понял.

В какой-то момент поддержка таких модификаторов, какstatic а такжеfinal методы интерфейса еще не были полностью изучены,цитируя Брайана Гетца:

Другая часть заключается в том, как далеко мы пойдем, чтобы поддерживать инструменты построения классов в интерфейсах, такие как конечные методы, частные методы, защищенные методы, статические методы и т. Д. Ответ: мы еще не знаем

С тех пор в конце 2011 года, очевидно, поддержкаstatic методы в интерфейсах были добавлены. Понятно, что это добавило много ценности самим библиотекам JDK, таким какComparator.comparing().

Вопрос:

Какова причинаfinal (а такжеstatic final) никогда не добрался до интерфейсов Java 8?

Ответы на вопрос(4)

Ваш ответ на вопрос