服务接口声明两个方法,它们显然执行相同的处理:
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));
}
哪个服务方法将被调用,为什么编译器在这种情况下不抱怨调用不明确?
答案 0 :(得分:11)
当存在多个可能的匹配项时,方法分辨率将选择most specific matching method。由于UnaryOperator<T>
扩展了Function<T,T>
,因此如果该lambda匹配(并且匹配),它比Function<T, T>
更具体,因此将使用UnaryOperator
重载。