我试图通过以下代码使创建多目录和文件更加容易:
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
参数相当无用。也许你想重新考虑一下设计。