¿Cómo se asegura que el compilador lambda equivalente para las siguientes afirmaciones
BinaryOperator<String> concatOperator = String::concat;
es
BinaryOperator<String> concatOperator = (resultString, inputString) -> resultString.concat(inputString);
y no
BinaryOperator<String> concatOperator = (resultString, inputString) -> inputString.concat(resultString);
Este comportamiento está bien documentado en el JLS
15.13.3. Evaluación de tiempo de ejecución del método de Referencias
Si la declaración de tiempo de compilación es un método de instancia, a continuación, la referencia de destino es el primer parámetro formal de la invocación del método . De lo contrario, no hay ninguna referencia de destino.
Si la declaración de tiempo de compilación es un método de instancia, a continuación, los argumentos de la expresión de invocación de método (si los hay) son la segunda y parámetros formales posteriores de la invocación del método . De lo contrario, los argumentos de la expresión de invocación de método son los parámetros formales de la invocación del método.
y parece razonable e intuitiva. Si se toma un método con aridad n
( n > 2
), se hace evidente que la referencia objetivo debe ser el primer parámetro, no el último, no el uno en el medio.