Java中传递Consumer<>静态实例报错,改用方法却正常的原因
问题原因解析
核心误解:方法引用的适用范围
MyClass::doVisit是Java的方法引用语法,它的作用是引用一个方法,而非已经实例化的函数式接口对象。
你的doVisit是一个静态字段,类型为Consumer<Path>,它本身是一个已创建好的Consumer实例,并非方法。当你用MyClass::doVisit时,编译器会尝试在MyClass中寻找一个名为doVisit、参数为Path的方法,但这个方法实际不存在,因此抛出"未定义适用的doVisit(Path)方法"的错误。
正确的调用方式
如果要传递静态字段里的Consumer实例,直接引用字段名即可:
DirWalker.walkDirs(/* a path */, MyClass.doVisit);
两种可行场景的原理
- 改为方法时正常运行:当
doVisit是静态方法时,MyClass::doVisit作为方法引用,其签名(接收Path参数、无返回值)完全匹配Consumer<Path>的accept(Path)方法签名,编译器会自动将这个方法引用适配为Consumer实例,因此可以正常工作。 - 内联lambda正常运行:内联的
p -> {...}是直接创建了一个Consumer<Path>的实现实例,完全符合方法参数的类型要求,所以没有问题。
内容的提问来源于stack exchange,提问作者melston
相关产品推荐
相关产品推荐

