Java:如何将Class传递给lambda



我试图通过以下代码使创建多目录和文件更加容易:

package ro.ex;
class File {
    public interface Lamb {
        public void call(Class c);
    }
    public static void tap(Lamb l) {
        l.call(File.class);
    }
    public static void mkdir(String path) {
    }
    public static void main(String[] args) {
        File.tap((f) -> {
            f.mkdir("dir");
            f.mkdir("dir2");
        });
    }
}

但在f.mkdir("dir")中,intellij的思想提升无法解决方法"mkdir"

我的问题是:如何更改代码以使主块中的代码正常工作

根据方法约定,File.tap()接受一个Lamb参数。

Lamb是一个函数接口(只包含一个抽象方法),lambda的主体是其抽象方法的匿名实现。

抽象方法有一个定义public void call(Class c),这就是代码编译失败的原因。您正在尝试传递File对象,而不是Class对象。

同时,mkdir是一个静态方法,可以这样调用:

public static void main(String[] args) {
    File.tap((f) -> {
        File.mkdir("dir");
        File.mkdir("dir2");
    });
}

您定义了一个(函数)接口Lamb,其单个方法将Class作为参数。

因此,lambda表达式(f) -> { ... }中的f属于Class类型。但是这个类不知道方法mkdir

您的自定义类File中有一个静态方法mkdir。静态方法的名称如下:

File.tap((f) -> {
    File.mkdir("dir");
    File.mkdir("dir2");
});

这使得方法Lamb.call(Class)中的Class参数相当无用。也许你想重新考虑一下设计。

相关内容

最新更新