java map 无法解析的编译问题_无法从java 8流中的静态上下文引用非静态方...

首先应该注意,消息不是由java编译器(javac)发出的,而是由IntelliJ IDEA发出的.实际启动构建过程时,可以在“Messages Build”窗口中看到javac消息.您在编辑器窗口中看到的是IDEA自己生成的消息,它们可能有所不同.

由于在IntelliJ IDEA中实现了方法参考分辨率,错误消息具有误导性.它认为只有当相应的SAM(单个抽象方法)参数的数量等于方法参数的数量加上一个并且第一个SAM参数类型与包含类的方法兼容时,才能解析非静态方法引用.参见the implementation(也是上面的SecondSearchPossible方法,为varargs方法执行了一些额外的魔术).

如果您的程序没有错误,它可以正常工作.但是,如果您的类型不匹配,则传递给toMap的函数的泛型参数不能被替换,因此它仍然是函数< T,R>,并且其apply方法的第一个参数只是T,它与Student类型不对应.因此,所谓的“第二次搜索”失败,IDEA认为该方法是从静态上下文引用的.虽然静态和非静态上下文在这里都不适用,但非静态上下文更好地匹配您的方法,至少根据参数的数量,因为getName()方法不接收任何参数.另一方面,IDEA逻辑是“如果非静态上下文不适用,则它是静态上下文”,因此是错误消息.

我认为这是一个错误,或者至少是一个可用性问题.我刚刚根据similar question记录了它here.希望我们能解决它.

免责声明:我是IntelliJ IDEA开发人员.

更新:在IDEA 2017.2中修复.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值