HPH:
Una interfaz de servicio declara dos métodos que aparentemente hacen el mismo proceso:
interface Service<T> {
<R> R process(Function<? super T, ? extends R> function);
T process(UnaryOperator<T> operator);
}
El servicio superior que se llama, como a continuación:
void process(Service<CharSequence> service) {
service.process(sequence -> sequence.subSequence(0, 1));
}
La cual uno de los métodos de servicio van a ser llamado y por qué el compilador no se queja una llamada ambigua en este contexto?
TJ Crowder:
La resolución del método elige el más específica método de emparejamiento cuando hay varias coincidencias posibles. Dado que UnaryOperator<T>
se extiende Function<T,T>
, en caso de que lambda coincide con él (y lo hace), es más específico que Function<T, T>
lo que el UnaryOperator
será utilizado sobrecarga.