我定义了以下方法.

class Some {

    void doSome(Consumer<? super Other> consumer) {
    }

    <T extends Collection<? super Other>> T doSome(T collection) {
        doSome(collection::add); // <<<<<<<<<<<<<<<<<<<
        return collection;
    }
}

现在,javac人在抱怨.

Java:对getAttributes的引用不明确 这两种方法都使用(java.util.unction.Consumer&lt;?Super Other&gt;)在...和方法Dosome(T)在...一些匹配

为什么javac不能区分ConsumerCollection

推荐答案

这是因为在调用doSome(T)时,collection::add不是pertinent to applicability.

具体地说,就是这种情况:

如果m是泛型方法,并且方法调用不提供显式类型参数,则是显式类型的lambda表达式或其对应的目标类型(从m的签名派生)为m的类型参数的精确方法引用表达式.

这里的mdoSome,这是一个泛型方法.collection:add是一个精确的方法参考.它的目标类型是(T) -> boolean(一个接受T并返回boolean的函数).(T) -> boolean包括类型参数T,因此它与适用性无关.

"与适用性相关"是Java决定在重载解析期间考虑哪些参数表达式的方式.它只是不考虑一些参数(那些与适用性无关的参数),因为这会使重载解析过于复杂.

由于collection::add实际上被"忽略"了,所以除了doSome(Consumer)之外,doSome(T)也是一种适用的方法,这显然是适用的.因此,存在过载解析模糊性.

我只想添加一个演员阵容来解决这个问题:

doSome((Consumer<? super Other>)collection::add);

与适用性相关的演员角色表达is.

另请参阅关于隐式类型的lambda表达式的这similar question个表达式,这些表达式也与适用性无关.

Java相关问答推荐

JsonPath在多个线程中返回错误的值

如何在Java中从XML中获取特定的 node ,然后将其删除?

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

Spring @Value default无法计算表达式

Javadoc在方法摘要中省略方法

WebSockets和Spring Boot安全性出现错误401

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

将关闭拍卖的TimerService

Spring Boot中的应用程序.properties文件中未使用的属性

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

Spring动态反序列化JSON可以是列表,也可以只是一个对象

从12小时开始的日期模式

在Java中将.GRF转换为图像文件

无法使用Open WebStart Java 8运行jnlp

如何在JSP中从select中获取值并将其放入另一个select

多线程、并发和睡眠未按预期工作

如何使JOOQ渐变脚本不重新创建表未更改的类?

ReturnedRect在升级后反转

使用原子整数的共享计数器并发增量

为什么 log4j 过滤器在appender中不起作用