首先应该注意,消息不是由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中修复.