为什么Java不抱怨调用不明确?

时间:2019-01-19 13:20:59

标签: java generics lambda java-8 functional-interface

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

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));
}

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

1 个答案:

答案 0 :(得分:11)

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