Por que uma referência de método Java com tipo de retorno corresponde à interface do Consumidor?
Estou confuso com o seguinte 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;}
}
Eu esperava que a atribuição do lambda3 falhasse, pois meu método de consumo não corresponde ao método de aceitação na Interface do Consumidor - os tipos de retorno são diferentes, String vs. nulo.
Além disso, eu sempre pensei que existe um relacionamento individual entre expressões Lambda e referências a métodos, mas esse claramente não é o caso, como mostra meu exemplo.
Alguém poderia me explicar o que está acontecendo aqui?