La seguente classe contiene una variabile membro runnable
che è inizializzata con un'istanza di una classe interna anonima. La classe interna riferimento allo stesso elemento:Perché lambda in Java 8 non consente il riferimento diretto alle variabili membro in cui le classi anonime non lo fanno?
class Example {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(runnable);
}
};
}
Questo non è un problema, purché il metodo non viene eseguita prima che il componente sia stato assegnato e il JLS consente un tale riferimento.
La dichiarazione della variabile membro potrebbe teoricamente essere convertito in un'espressione lambda come questo:
Runnable runnable =() -> System.out.println(runnable);
Per la mia comprensione, questo è funzionalmente equivalente all'esempio precedente, ma viene respinto dal javac 1.8.0_05
con il seguente messaggio di errore:
Mentre quella affermazione è vera, non vedo perché questo non è stato consentito. Questo è stato intenzionalmente disabilitato, forse perché le espressioni lambda sono compilate con un codice byte differente che potrebbe portare a problemi se fosse permesso? O era semplicemente vietato perché c'erano già problemi con questi riferimenti quando venivano usati in classi interne anonime? O è stato inavvertitamente annullato dagli scrittori di JLS? O è un bug in javac
?
In eclissi, questo funziona: 'Runnable runnable =() -> System.out.println (this.runnable); 'fallisce solo senza il qualificatore' this' aggiunto. –