Die folgende Klasse enthält eine Elementvariable runnable
, die mit einer Instanz einer anonymen inneren Klasse initialisiert wird. Die innere Klasse verweist dasselbe Mitglied:Warum verbieten Lambdas in Java 8 Vorwärtsverweise auf Member-Variablen, bei denen anonyme Klassen dies nicht tun?
class Example {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(runnable);
}
};
}
Dies ist kein Problem, solange das Verfahren nicht vor dem Elemente zugeordnet wurde ausgeführt und das JLS ermöglicht so eine Referenz. von javac 1.8.0_05
mit folgendem
Runnable runnable =() -> System.out.println(runnable);
Zu meinem Verständnis, das dem vorherigen Beispiel funktional äquivalent ist, aber es wird abgelehnt:
Die Deklaration der Membervariable theoretisch auf einen Lambda-Ausdruck wie folgt umgewandelt werden könnte Fehlermeldung:
Error:(2, 54) java: self-reference in initializer
Während diese Aussage wahr ist, sehe ich nicht, warum dies nicht erlaubt war. War dies absichtlich nicht erlaubt, vielleicht weil Lambda-Ausdrücke zu verschiedenen Byte-Codes kompiliert wurden, was zu Problemen führen würde, wenn es erlaubt wäre? Oder wurde es einfach nicht erlaubt, weil es schon Probleme mit diesen Referenzen gab, als sie in anonymen inneren Klassen verwendet wurden? Oder wurde es von den JLS-Autoren unbeabsichtigt abgelehnt? Oder ist es ein Fehler in javac
?
In Eclipse funktioniert dies: 'Runnable Runnable =() -> System.out.println (this.runnable); 'Es scheitert nur ohne das hinzugefügte' this'-Qualifikationsmerkmal. –