JLS :
Operatorem o najniższym priorytecie jest strzałka wyrażenia lambda (->) , po której następują operatory przypisania.
Podążano w jakim kierunku (zwiększenie priorytetu, zmniejszenie priorytetu)? - „obserwowane” oznacza przypisanie o wyższym priorytecie lub niższym priorytecie (w odniesieniu do operatora strzałki)? Wydaje mi się, że rośnie, ponieważ „najniższy” (dla strzałki) oznacza absolutnie najniższy.
Jak rozumiem, strzałka (->) powinna znajdować się na samym dole tabeli pierwszeństwa operatora Princeton (czyli poniżej wszystkich operatorów przypisania), a zatem strzałka (->) ma poziom priorytetu 0 (zero) (zgodnie z tą tabelą).
Czy mam rację w moim rozumieniu?
ExamTray wydaje się mówić, że priorytet strzały jest co najmniej taki sam jak przypisanie ... Plus wyjaśnił, że skojarzenie strzały jest Lewo-> To-> Prawo (w przeciwieństwie do przypisania). Nie znalazłem żadnego cytatu JLS dotyczącego asocjatywności strzał.
Zawsze uważałem, że z jakiegoś powodu priorytet przydziału jest zasadniczo najniższy.
źródło
The lowest precedence operator is the arrow of a lambda expression.
->
jest niska est , operatory przypisania nie może mieć niską er pierwszeństwo.IntFunction fo = a->b->a-b; // in test
Implikuje priorytet / powiązanie -> ogólnie. Postanowiłem więc wyjaśnić -> miejsce pierwszeństwa / skojarzenia w całej tabeli pierwszeństwa / skojarzenia, ponieważ czułem się niepewnie.IntUnaryOperator op; op = x -> x;
jest interesujący. Być może(op = x) -> x
nie jest brany pod uwagę, ponieważop = x
nie jest prawidłową instancjąLambdaParameters
produkcji?Odpowiedzi:
Zwróć uwagę na zdanie poprzedzające cytowany tekst JLS :
Gramatyka języka Java określa, które konstrukcje są możliwe i domyślnie pierwszeństwo operatora.
Nawet stół Princeton , który połączyłeś, stwierdza:
Tak więc gramatyka języka Java nie pozwala na wyrażenia lambda po lewej stronie operatora przypisania i podobnie nie pozwala na przypisania po lewej stronie
->
. Nie ma więc żadnej dwuznaczności między tymi operatorami, a zasada pierwszeństwa, choć wyraźnie określona w JLS, staje się bez znaczenia.Pozwala to skompilować, np. Taki klejnot, bez dwuznaczności:
źródło
Najpierw wyjaśnijmy tutaj praktyczny problem.
Zakładając, że masz taką definicję
Następujące elementy są akceptowane składniowo i działają zgodnie z oczekiwaniami:
Oznacza to, że mamy funkcję tożsamości
int
przypisaną doop
zmiennej. Ale gdyby=
miał wyższy priorytet, spodziewalibyśmy się, że Java to zinterpretujeKtóry nie jest poprawny pod względem składniowym, powinien więc wystąpić błąd kompilacji. Dlatego zadanie nie ma w praktyce większego pierwszeństwa niż strzałka.
Ale poniższe są również OK (załóżmy, że
t
jest to zmienna typu klasa / instancjaint
):To się kompiluje, a funkcja, jeśli zastosowana, przypisuje wartość argumentu do,
t
a także zwraca ją.Oznacza to, że strzałka nie ma wyższego pierwszeństwa niż przypisanie
t = x
. W przeciwnym razie byłoby to interpretowane jakoi oczywiście nie dzieje się tak.
Wygląda więc na to, że operacje mają równy priorytet. Co więcej, są one odpowiednio skojarzone. Sugeruje to gramatyka rozdziału 19 JLS :
Tak więc prawa strona ciała lambda prowadzi nas z powrotem do tego
Expression
, co oznacza, że możemy mieć w sobie lambda (o wyższym priorytecie) lub przypisanie (o wyższym priorytecie). Rozumiem przez „wyższy priorytet”, że im głębiej przejdziesz przez reguły produkcji, tym wcześniej wyrażenie zostanie ocenione.To samo dotyczy operatora przypisania:
Po raz kolejny prawa strona zadania przenosi nas z powrotem
Expression
, abyśmy mogli otrzymać wyrażenie lambda lub zadanie.Zamiast więc polegać na tekście JLS, gramatyka daje nam dobrze zdefiniowany opis sytuacji.
źródło