Sollte JDK 9 die Instanziierung von Lambda-Ausdrücken nicht zulassen, wenn letzte Felder in der überschriebenen Methode referenziert werden?

8

Ich habe mit dem neuen Eclipse Neon gearbeitet und einige meiner Codes haben mir sofort Fehler gemacht.
Das war mir zunächst seltsam, aber dann fand ich hier , dass der Neon ECJ (Eclipse Java Compiler) übernimmt die Einstellung des frühen Release-Compilers JDK 9.
Ich stoße nicht auf das gleiche Problem wie in diesem Link, sondern auf ein anderes, das ich hier erklären werde.

Geben Sie mit Lambda Expression-Deklarationen als Felder

aus

Hier ist eine Testklasse, die mir einen Kompilierungsfehler in Eclipse Neon , dem JDK 9 Compiler und dem JDK 8 Compiler (nicht früheren Versionen von Eclipse) liefert. .

%Vor%

Angesichts des obigen Codes sind die Fehler in Zeile 4 für suffix wie folgt:

%Vor%

Sehen Sie jetzt, was mit derselben Klasse passiert, wenn ich die suffix -Felddeklaration vor die addSuffix -Deklaration verschiebe.

%Vor%

Mit dem obigen Code sind die Fehler in Zeile 6 für suffix wie folgt:

%Vor%

Sollte sich Java 9 so verhalten?

Das hat in JDK 8 perfekt funktioniert; scheint wie eine seltsame Sache, um plötzlich durchzusetzen. Vor allem, wenn bereits Prüfungen zur Kompilierungszeit durchgeführt wurden, um sicherzustellen, dass die endgültigen Felder korrekt instanziiert werden.
Daher würde zu dem Zeitpunkt, an dem auf die Funktion addSuffix zugegriffen wird, ein Wert für suffix sein ( null oder sonst ist eine andere Geschichte) .

Ich werde auch bemerken, dass ich den folgenden Code ausprobiert habe, der mit JDK9 und ECJ gut kompiliert:

%Vor%

Es scheint, dass in JDK 9 ein großer Unterschied zwischen anonymen Klassendeklarationen und Lambda-Ausdrücken besteht. In diesem Fall, in dem wir einen Compilerfehler erhalten, imitiert der ECJ den JDK 9 Compiler genau.

Problem mit Stream & amp; Generika

Dieser hat mich wirklich überrascht, weil ich mir nicht vorstellen kann, warum der Compiler das anders interpretieren würde, als was der Generic im Code anzeigt:

%Vor%

Dieser Code enthält folgende Fehler:

%Vor%

Angesichts dieser Informationen erscheint es in diesem Fall, dass der EuGH daran schuld ist, dass er das JDK 9 nicht richtig nachgeahmt hat und nur ein Eclipse Bug ist.

    
aaiezza 10.02.2017, 20:49
quelle

1 Antwort

7

Erstens, wenn Sie den von Ihnen verlinkten Fehlerbericht lesen, übernimmt ECJ nicht die "Einstellung" des JDK 9-Compilers. Beide Compiler hatten einen Bug, von denen einer in JDK 9, der andere in Neon behoben ist.

Das Lambda-Feld kann für mich sowohl in Eclipse Mars als auch in Java 8 nicht kompiliert werden. Und es macht durchaus Sinn, da es potentiell die Unveränderlichkeitsgarantie der letzten Felder verletzt. Überraschend ist, dass die anonyme Unterklasse erfolgreich kompiliert wird. Betrachten Sie dieses Beispiel:

%Vor%

Ich vermute, dass das obige ein Fehler in beiden Compilern sein könnte.

Wie bei dem Stream-Fehler wird auch in Java 8 der gleiche Code kompiliert. Es ist wahrscheinlich nur ein weiterer ECJ-Bug, der nichts mit Java 9 zu tun hat.

Möglicherweise verwandt:

shmosel 10.02.2017, 21:24
quelle