Lambdas, die nur aus einem Statement bestehen, und ohne {} geschrieben werden, werden falsch geparst #17

Closed
opened 2017-11-06 23:19:59 +00:00 by fayez.abu-alia · 1 comment

Z.B: Runnable lam = () -> System.out.println("lambda");
wird als Return-statement geparst.
Aber Runnable lam = () -> {System.out.println("lambda");};
wird richtig geparst.
Obwohl beide gleich sind.

Z.B: Runnable lam = () -> System.out.println("lambda"); wird als Return-statement geparst. Aber Runnable lam = () -> {System.out.println("lambda");}; wird richtig geparst. Obwohl beide gleich sind.
Owner

Der Fall:
lam = () -> expr;
ist syntactic sugar und steht eigentlich für:
lam = () -> {return expr;}

Der Java-Compiler kann feststellen, ob der body eines Lambda Ausdrucks einen Wert oder Void zurückgibt (siehe 1)
Unser Compiler kann das zum Zeitpunkt des parsens nicht. Beispiel:

class A{
void m(){}
}
class B{
Integer m(){return 1;}
}
[...]
lam = () -> a.m(); // Hier ist unklar, ob A.m() oder B.m() aufgerufen wird

Wir können nicht feststellen, ob ein Lambda-Ausdruck:
lam = () -> expr;
nun zu lam = () -> { return expr; } oder zu lam = () -> { expr; } geparst werden soll

Der Fall: lam = () -> expr; ist syntactic sugar und steht eigentlich für: lam = () -> {return expr;} Der Java-Compiler kann feststellen, ob der body eines Lambda Ausdrucks einen Wert oder Void zurückgibt (siehe [1]) Unser Compiler kann das zum Zeitpunkt des parsens nicht. Beispiel: class A{ void m(){} } class B{ Integer m(){return 1;} } [...] lam = () -> a.m(); // Hier ist unklar, ob A.m() oder B.m() aufgerufen wird Wir können nicht feststellen, ob ein Lambda-Ausdruck: lam = () -> expr; nun zu lam = () -> { return expr; } oder zu lam = () -> { expr; } geparst werden soll [1]: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-LambdaBody
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#17
No description provided.