Considerare seguenti classi:Perché le espressioni lambda in Java 8 richiedono variabili utilizzate al suo interno per utilizzare il modificatore "finale", ma non quando si utilizza il riferimento al metodo?
class Foo<T> {
void handle(T t) {
System.out.println("handling " + t);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Foo<Integer> f = new Foo<>();
list.forEach(f::handle); // compiles fine
//list.forEach(obj -> f.handle(obj));// compilation error
f = new Foo<>(); // reassign f
}
}
Perché ottengo errore di compilazione per obj -> f.handle(obj)
, ma non per f::handle
?
Um, entrambe le versioni _should_ funzionano senza il modificatore 'final'. (Tuttavia, deve essere ancora efficacemente definitivo.) –
Sì, la domanda era: perché la seconda versione non richiede il modificatore finale. –
_Nessuna versione dovrebbe richiedere la finale. –