2016-01-10 7 views
8

Java-8 statische Methoden innere Schnittstelle, aber restricts es Aufruf durch nur Schnittstellennamen ermöglicht definieren:Illegal statische Schnittstellenmethodenaufruf

9.4: An interface can declare static methods, which are invoked without reference to a particular object.

Eg:

interface X { 
    static void y() { 
    } 
} 

... 

X x = new X() {}; 
x.y(); 

Ursachen Fehler:

error: illegal static interface method call 
     x.y(); 
      ^
    the receiver expression should be replaced with the type qualifier 'X' 

Oft in JLS haben solche Verbote eine Erklärung. In diesem Fall habe ich nichts Detailliertes gefunden. Ich suche daher nach einer umfassenden oder verbindlichen Erklärung dieser Regel: Warum ist es verboten, die statische Methode über eine bestimmte Objektreferenz aufzurufen? Was bricht es?

+14

Vielleicht ist die bessere Frage, warum statische Methoden auf Objektreferenzen an erster Stelle aufgerufen werden können ... –

+1

In diesem Sinne, wie erhalten wir eine Instanz einer Schnittstelle X in der Zeile darüber? – aiguy

+2

stimme völlig mit @SkinnyJ Ich glaube, Java-Entwickler versuchen, ihren Fehler zu korrigieren, indem sie die statische verfügbar machen durch Objekt, das etwas verwirrend ist – silentprogrammer

Antwort

16

Es ist ein ziemlich starker Konsens, dass die fragliche Syntax auch für statische Methoden in Klassen nicht erlaubt gewesen sein sollte, aber zu der Zeit, die realisiert wurde, war es zu spät, um sie zu ändern. Es war nicht zu spät für die kürzlich hinzugefügten Schnittstellenmethoden.

Darüber hinaus würde die Einführung dieser Syntax die Möglichkeit des Rautenproblems eröffnen, da eine Klasse Schnittstellen implementieren könnte, die kollidierende Methoden definieren.

+8

Diese Analyse ist korrekt. Wir betrachten die Möglichkeit, eine statische Methode über eine Instanz als einen Sprachentwurfsfehler aufzurufen, der leider nicht rückwirkend für Klassen behoben werden kann. Wir könnten zumindest nicht den gleichen Fehler machen. (Manchmal wählen wir absichtlich "denselben Fehler", wenn wir die Sprache erweitern, indem wir die Konsistenz über lokale Verbesserungen wählen - aber die Wahl beinhaltet einen Urteilsspruch "Nun, wie viel besser ist die Verbesserung?" Hier war der Unterschied groß Genug.) –

+1

@Brian Goetz: ... und es könnte bestehenden Code brechen (einmal neu kompiliert), wenn eine neue 'static' Interface-Methode spezifischer ist als die zuvor aufgerufene Instanz-Methode. Ich nehme an, dies ist auch einer der Gründe dafür, dass statische Interface-Methoden nicht erben werden. Die Entwicklung von Schnittstellen sollte die geringsten Auswirkungen auf vorhandene Implementierungen haben. – Holger

+1

@Holger ... und außerdem hätte die gleichzeitige Einführung von Standardwerten und vererbbaren Statiken noch mehr Verwirrung stiften müssen. Viele Gründe, diese Linie hier zu zeichnen. –