JLS :
Der Operator mit der niedrigsten Priorität ist der Pfeil eines Lambda-Ausdrucks (->) , gefolgt von den Zuweisungsoperatoren.
In welche Richtung verfolgt (Priorität erhöhen, Priorität verringern)? - "gefolgt" bedeutet, dass die Zuweisung eine höhere oder niedrigere Priorität hat (in Bezug auf den Pfeiloperator)? Ich denke, in zunehmendem Maße, weil "niedrigste" (für Pfeil) absolut niedrigste bedeutet.
Soweit ich weiß, sollte sich der Pfeil (->) ganz unten in dieser Prioritäts-Tabelle für Princeton- Operatoren befinden (dh unter allen Zuweisungsoperatoren), daher sollte der Pfeil (->) die Prioritätsstufe 0 (Null) haben (gemäß dieser Tabelle).
Bin ich in meinem Verständnis richtig?
ExamTray scheint zu sagen, dass die Pfeilpriorität mindestens der Zuweisung entspricht ... Außerdem wurde klargestellt, dass die Pfeilassoziativität Links-> Nach-> Rechts ist (im Gegensatz zur Zuweisung). Ich habe kein JLS-Zitat für Pfeilassoziativität gefunden.
Ich habe immer gedacht, dass die Zuweisungspriorität aus einem bestimmten Grund hauptsächlich am niedrigsten ist.
quelle
The lowest precedence operator is the arrow of a lambda expression.
->
die niedrig ist est , Zuweisungsoperator können nicht niedrig haben sie Vorrang.IntFunction fo = a->b->a-b; // in test
Impliziert Priorität / Assoziativität von -> im Allgemeinen. Deshalb habe ich mich entschlossen zu klären -> Vorrang / Assoziativitätsplatz in der gesamten Vorrang- / Assoziativitätstabelle, weil ich mich nicht sicher war.IntUnaryOperator op; op = x -> x;
ist interessant. Vielleicht(op = x) -> x
wird nicht berücksichtigt, weilop = x
keine gültige Instanz derLambdaParameters
Produktion ist?Antworten:
Beachten Sie den Satz vor dem zitierten JLS-Text :
Die Grammatik der Java-Sprache bestimmt, welche Konstrukte möglich sind, und implizit die Priorität des Operators.
Sogar die von Ihnen verknüpfte Princeton-Tabelle lautet:
Die Grammatik der Java-Sprache erlaubt also keine Lambda-Ausdrücke links von einem Zuweisungsoperator und erlaubt auch keine Zuweisungen links von
->
. Es ist also keine Mehrdeutigkeit zwischen diesen Operatoren möglich, und die Vorrangregel wird, obwohl sie im JLS ausdrücklich angegeben ist, bedeutungslos.Dies ermöglicht das Kompilieren, z. B. eines solchen Edelsteins, ohne Mehrdeutigkeit:
quelle
Lassen Sie uns zunächst das praktische Problem hier erläutern.
Angenommen, Sie haben eine Definition wie
Folgendes wird syntaktisch akzeptiert und funktioniert wie erwartet:
Das heißt, wir haben der Identität eine Identitätsfunktion
int
zugewiesenop
. Wenn=
wir jedoch eine höhere Priorität hätten, würden wir erwarten, dass Java dies als interpretiertWas syntaktisch nicht gültig ist, sollte daher ein Kompilierungsfehler sein. Daher hat die Zuweisung in der Praxis keine höhere Priorität als der Pfeil.
Das Folgende ist aber auch in Ordnung (vorausgesetzt, es
t
handelt sich um eine Klassen- / Instanzvariable vom Typint
):Dies wird kompiliert, und die Funktion weist, falls angewendet, den Wert des Operanden zu
t
und gibt ihn auch zurück.Dies bedeutet, dass der Pfeil keine höhere Priorität als die Zuweisung hat
t = x
. Andernfalls wäre es interpretiert worden alsund klar, das ist nicht was passiert.
Es scheint also, dass die Operationen den gleichen Vorrang haben. Was mehr ist, dass sie rechtsassoziativ sind. Dies geht aus der Grammatik in JLS Kapitel 19 hervor :
Die rechte Seite des Lambda-Körpers bringt uns zurück
Expression
, was bedeutet, dass wir entweder ein Lambda (mit höherer Priorität) oder eine Zuordnung (mit höherer Priorität) darin haben können. Was ich unter "höherer Priorität" verstehe, ist, dass der Ausdruck umso früher ausgewertet wird, je tiefer Sie durch die Produktionsregeln gehen.Gleiches gilt für den Zuweisungsoperator:
Noch einmal, die rechte Seite der Aufgabe wirft uns zurück
Expression
, so dass wir dort einen Lambda-Ausdruck oder eine Aufgabe haben können.Anstatt sich auf den JLS-Text zu verlassen, gibt uns die Grammatik eine genau definierte Beschreibung der Situation.
quelle