Warum ist "final" in Java 8-Schnittstellenmethoden nicht zulässig?

Eine der nützlichsten Funktionen von Java 8 sind die neuendefault Methoden an Schnittstellen. Es gibt im Wesentlichen zwei Gründe (es kann auch andere Gründe geben), warum sie eingeführt wurden:

Bereitstellung der tatsächlichen Standardimplementierungen. Beispiel:Iterator.remove()JDK-API-Entwicklung zulassen. Beispiel:Iterable.forEach()

Aus Sicht eines API-Designers hätte ich gerne andere Modifikatoren für Schnittstellenmethoden verwendet, z.final. Dies ist nützlich, wenn Sie Komfortmethoden hinzufügen und "ac, cidental" -Overrides in implementierenden Klassen verhindern:

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

Das obige ist bereits gängige Praxis, wennSender waren eine Klasse:

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

Jetzt,default undfinal sind offensichtlich widersprüchliche Keywords, aber das Standard-Keyword selbstwäre nicht unbedingt erforderlich gewesenIch gehe also davon aus, dass dieser Widerspruch absichtlich ist, um die subtilen Unterschiede zwischen zu reflektieren"Klassenmethoden mit Körper" (nur Methoden) und"Schnittstellenmethoden mit Körper" (Standardmethoden), d. h. Unterschiede, die ich noch nicht verstanden habe.

Irgendwann Unterstützung für Modifikatoren wiestatic undfinal über Schnittstellenmethoden wurde noch nicht vollständig erforscht,unter Berufung auf Brian Goetz:

Der andere Teil ist, wie weit wir gehen, um Tools zur Klassenbildung in Schnittstellen zu unterstützen, wie endgültige Methoden, private Methoden, geschützte Methoden, statische Methoden usw. Die Antwort lautet: Wir wissen es noch nicht

Seit dieser Zeit Ende 2011 natürlich Unterstützung fürstatic Methoden in Schnittstellen wurde hinzugefügt. Dies hat den JDK-Bibliotheken selbst zweifellos viel Wert verliehen, wie z. B. mitComparator.comparing().

Frage:

Was ist der Grundfinal (und auchstatic final) hat es noch nie zu Java 8 Interfaces geschafft?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage