¿Por qué las expresiones lambda en Java 8 requieren que se utilicen variables dentro de él para usar el modificador "final", pero no cuando se usa la referencia de método?

Considere la siguiente clase:

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

    }
}

¿Por qué recibo un error de compilación paraobj -> f.handle(obj), pero no paraf::handle?

Respuestas a la pregunta(2)

Su respuesta a la pregunta