【问题标题】:Why Java is not complaining about an ambiguous call?为什么 Java 不抱怨一个模棱两可的调用?
【发布时间】:2019-01-19 13:20:59
【问题描述】:

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

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

将调用哪个服务方法以及为什么编译器不抱怨在这种情况下的模棱两可的调用?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我完全忘记了UnaryOperator&lt;T&gt;Function&lt;T, T&gt; 之间的继承关系,非常感谢。确实,消除了歧义。
    • @HPH - 公平地说,我必须查一下。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2023-03-24
    • 2016-03-08
    • 2019-11-28
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多