为什么 Java 不抱怨模糊调用?

Why Java is not complaining about an ambiguous call?

一个服务接口声明了两个显然做同样处理的方法:

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

上面的服务调用如下:

void process(Service<CharSequence> service) {
    service.process(sequence -> sequence.subSequence(0, 1));
}

将调用哪个服务方法,为什么编译器在这种情况下不抱怨不明确的调用?

当有多个可能的匹配项时,方法解析选择 most specific matching method。由于 UnaryOperator<T> 扩展了 Function<T,T>,如果该 lambda 匹配它(确实如此),它比 Function<T, T> 更具体,因此将使用 UnaryOperator 重载。