为什么Java不抱怨模糊的电话?

HPH*_*HPH 6 java generics lambda java-8 functional-interface

服务接口声明了两个显然执行相同处理的方法:

interface Service<T> {
    <R> R process(Function<? super T, ? extends R> function);
    T process(UnaryOperator<T> operator);
}
Run Code Online (Sandbox Code Playgroud)

上面的服务被调用如下:

void process(Service<CharSequence> service) {
    service.process(sequence -> sequence.subSequence(0, 1));
}
Run Code Online (Sandbox Code Playgroud)

将调用哪种服务方法以及为什么编译器不会在此上下文中抱怨模糊调用?

T.J*_*der 11

当存在多个可能的匹配时,方法解析选择最具体的匹配方法.自从UnaryOperator<T>扩展以来Function<T,T>,如果lambda匹配它(并且确实如此),它将更具体,Function<T, T>因此UnaryOperator将使用重载.