无法传递Consumer<>实例

问题描述 投票:0回答:2

我有一个类用于遍历目录树并对每个文件/目录执行操作。看起来像这样:

class DirWalker {
  public static void walkDirs(Path startingPath, Consumer<Path> vAction)  {...}
}

在另一堂课上我有以下内容:

public static Consumer<Path> doVisit = p -> {...}

我尝试在我的 Java 代码中使用它,如下所示:

DirWalker.walkDirs(/* a path */, MyClass::doVisit);

但是,我在这里收到错误消息“MyClass 没有定义适用于此处的 doVisit(Path)”。我可以将

doVisit
成员更改为方法并且它可以工作。

如果我在

walkDirs
调用中使用 lambda 内联,它会工作得很好。但是创建
Consumer
的实例并将其传递给
walkDirs
方法会失败。为什么会这样?

java functional-interface
2个回答
1
投票

仅当 doVisit 是方法时,您才可以使用方法引用语法 (

MyClass::doVisit
)。正如您所声明的那样, doVisit 是一个字段,应该以
MyClass.doVisit

的形式访问

如果要使用方法引用语法,可以将其编写为满足

Consumer<Path>
接口的方法,而不是内联 lambda 表达式,如下所示

public static void doVisit(Path p) {
    ...
}

0
投票

您的

doVisit
Consumer
的实例。所以你不能使用方法引用。只需将引用传递给您的
walkDirs
方法即可。

import java.nio.file.Path;
import java.util.function.Consumer;

public class MyClass {
    public static Consumer<Path> doVisit = path -> {};
    
    public static void main(String[] args) {
        DirWalker.walkDirs(Path.of("/tmp"), doVisit); // Static
    }

    public static class DirWalker {
        public static void walkDirs(Path startingPath, Consumer<Path> vAction)  {

        }
    }
}

如果要引用该字段,请使用

instance.doVisit
:

import java.nio.file.Path;
import java.util.function.Consumer;

public class MyClass {
    public Consumer<Path> doVisit = path -> {};

    public static void main(String[] args) {
        MyClass instance = new MyClass();
        DirWalker.walkDirs(Path.of("/tmp"), instance.doVisit); // Instance
    }

    public static class DirWalker {
        public static void walkDirs(Path startingPath, Consumer<Path> vAction)  {

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.