Warum erfordern Lambda-Ausdrücke in Java 8 die Verwendung von Variablen, um den Modifikator "final" zu verwenden, jedoch nicht, wenn Sie eine Methodenreferenz verwenden?

Folgende Klasse berücksichtigen:

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

    }
}

Warum erhalte ich einen Kompilierungsfehler für obj -> f.handle(obj), aber nicht fürf::handle?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage