¿Por qué una referencia de método Java con tipo de retorno coincide con la interfaz del consumidor?

Estoy confundido por el siguiente código

class LambdaTest {
    public static void main(String[] args) {
        Consumer<String>         lambda1 = s -> {};
        Function<String, String> lambda2 = s -> s;

        Consumer<String>         lambda3 = LambdaTest::consume; // but s -> s doesn't work!
        Function<String, String> lambda4 = LambdaTest::consume;
    }

    static String consume(String s) { return s;}
}

Hubiera esperado que la asignación de lambda3 fallara ya que mi método de consumo no coincide con el método de aceptación en la interfaz del consumidor: los tipos de retorno son diferentes, String vs. void.

Además, siempre pensé que existe una relación uno a uno entre las expresiones Lambda y las referencias de métodos, pero este no es el caso, como lo muestra mi ejemplo.

¿Podría alguien explicarme qué está pasando aquí?

Respuestas a la pregunta(2)

Su respuesta a la pregunta