¿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í?