我最近偶然发现了一段我无法用java理解的代码。我已经创建了这种相同结构的小版本:
public class StaticMethodClass {
static void IDK(Integer i, String somethingElse) {
System.out.println("It has been done");
}
public static void main(String... whatever) {
Action.ITEM.doStuff();
}
}
interface Func {
void exec(Integer i, String somethingElse);
}
enum Action {
ITEM(StaticMethodClass::IDK);
private Func f;
Action(Func f){
this.f = f;
}
void doStuff() {
this.f.exec(1, "huh");
}
}
我不能像Action.ITEM一样构建它的部分,因为它应该得到一个实现Func
接口的类。相反,它传递了一个方法,它以某种方式隐式转换。
我的问题是这是如何运作的,以及适用的规则。
答案 0 :(得分:7)
这是一个相对较新的构造,称为method reference。直到Java 8才能使用它。
我无法以
Action.ITEM
的构造方式绕过它,因为它应该有一个实现Func
接口的类。
方法引用提供了创建此类实现的快捷方式:而不是您编写
ITEM((i, e) -> StaticMethodClass.IDK(i, e));
只要IDK
方法的签名与Func
的{{1}}方法的签名完全匹配,编译器就会通过“快捷方式”语法为您计算出来
注意:上面的Lambda版本本身就是
的快捷方式exec
所以方法参考是快捷方式的快捷方式。