Por que "final" não é permitido nos métodos de interface do Java 8?

Um dos recursos mais úteis do Java 8 são os novosdefault métodos em interfaces. Existem essencialmente duas razões (podem existir outras) pelas quais elas foram introduzidas:

Fornecendo implementações padrão reais. Exemplo:Iterator.remove()Permitindo a evolução da API do JDK. Exemplo:Iterable.forEach()

Da perspectiva de um designer de API, eu gostaria de poder usar outros modificadores nos métodos de interface, por exemplofinal. Isso seria útil ao adicionar métodos de conveniência, evitando substituições "ac, acidentais" na implementação de classes:

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);
}

O exposto acima já é prática comum seSender eram uma classe:

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);
}

Agora,default efinal obviamente estão contradizendo palavras-chave, mas a palavra-chave padrão em sinão teria sido estritamente necessário, então estou assumindo que essa contradição seja deliberada, para refletir as diferenças sutis entre"métodos de classe com corpo" (apenas métodos) e"métodos de interface com o corpo" (métodos padrão), ou seja, diferenças que ainda não entendi.

Em algum momento, o suporte a modificadores comostatic efinal nos métodos de interface ainda não foi totalmente explorado,citando Brian Goetz:

A outra parte é até onde vamos dar suporte a ferramentas de criação de classe em interfaces, como métodos finais, métodos particulares, métodos protegidos, métodos estáticos etc. A resposta é: ainda não sabemos

Desde então, no final de 2011, obviamente, o suporte parastatic métodos em interfaces foi adicionado. Claramente, isso agregou muito valor às próprias bibliotecas JDK, como comComparator.comparing().

Pergunta, questão:

Qual é a razãofinal (e tambémstatic final) nunca chegou às interfaces Java 8?

questionAnswers(4)

yourAnswerToTheQuestion