服务接口声明两个方法,它们显然执行相同的处理:
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 将使用过载。
UnaryOperator<T>
Function<T,T>
Function<T, T>
UnaryOperator