为什么 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
重载。
一个服务接口声明了两个显然做同样处理的方法:
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
重载。