Frage

Diese Frage ist ein Follow-up zu: Warum kann ‚t ich nenne ein Verfahren außerhalb einer anonymen Klasse mit dem gleichen Namen

Diese vorherige Frage Antwort Warum , aber jetzt möchte ich wissen, ob Javac sollte run (int bar) finden? (Siehe vorherige Frage, warum Lauf (42) ausfällt)

Wenn es nicht soll, ist es aufgrund einer spec? Ist es mehrdeutigen Code produzieren? Mein Punkt ist, ich denke, das ist ein Bug. Während die vorherige Frage erklärt, warum dieser Code zu kompilieren fehlschlägt, halte ich es kompilieren soll, wenn Javac höher im Baum gesucht, wenn es ein Spiel auf dem derzeitigen Niveau zu finden, fehlschlägt. IE. Wenn this.run () nicht übereinstimmt, sollte es automatisch NotApplicable.this für eine run-Methode überprüfen.

Beachten Sie auch, dass foo (int bar) korrekt gefunden. Wenn Sie Grund geben, warum laufen (int bar) nicht gefunden werden kann, muss auch erklären, warum foo (int bar) zu finden ist.

public class NotApplicable {

    public NotApplicable() {
        new Runnable() {
            public void run() {

                // this works just fine, it automatically used NotApplicable.this when it couldn't find this.foo
                foo(42);

                // this fails to compile, javac find this.run(), and it does not match
                run(42);

                // to force javac to find run(int bar) you must use the following
                //NotApplicable.this.run(42);
            }
        };
    }

    private void run(int bar) {
    }

    public void foo(int bar) {
    }
}
War es hilfreich?

Lösung

Dieses Verhalten von javac entspricht der Spezifikation. Siehe §15.12 Method Invocation Expressions in der Java Language Specification, insbesondere der Absatz unter "Compile Time Step 1" Erklärung der Bedeutung eines uneingeschränkten Methodenaufruf:

  

Wenn die Bezeichner innerhalb des Bereichs angezeigt wird (§6.3) eine sichtbaren Methode Erklärung mit diesem Namen, dann muss es eine umschließender Typdeklaration sein, von denen das Verfahren ein Mitglied ist. Es sei T die innerste solche Typdeklaration sein. Die Klasse oder Schnittstelle zu suchen ist T.

Mit anderen Worten, die nicht qualifizierte Methode name wird in allen umschließenden Bereiche durchsucht, und die innerste „Typdeklaration“ (was bedeutet, entweder eine Klasse oder eine Schnittstelle Erklärung), in dem der Name gefunden wird ist derjenige, der für die ganze Signatur (in "Compile Time Step 2").

gesucht wird

Andere Tipps

Klingt wie ein Rezept für Mehrdeutigkeit und Zerbrechlichkeit zu mir -., Sobald eine neue Methode in der Basisklasse hinzugefügt wird (okay, nicht so wahrscheinlich für eine Schnittstelle ...) die Bedeutung des Codes ändert vollständig

Anonyme Klassen sind schon ziemlich hässlich - machen diesen Bit expliziter stört mich überhaupt nicht.

Versuchen

NotApplicable.this.run(42);

statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top