Wor*_*tiz 1 java oop static-methods interface
我最近偶然发现了一段我无法用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");
}
}
Run Code Online (Sandbox Code Playgroud)
我不能像Action.ITEM一样构建它,因为它应该得到一个实现Func接口的类.相反,它传递了一个方法,它以某种方式隐式转换.
我的问题是这是如何工作的,以及这里适用的规则.
这是一个相对较新的构造,称为方法引用.它直到Java 8才可用.
我不能以
Action.ITEM构造的方式绕过它,因为它应该得到一个实现Func接口的类.
方法引用提供了创建此类实现的快捷方式:而不是您编写
ITEM((i, e) -> StaticMethodClass.IDK(i, e));
Run Code Online (Sandbox Code Playgroud)
编译器计算它为你通过"捷径"的语法,只要签名IDK方法是签名完全匹配Func的exec方法.
注意:上面的Lambda版本本身就是一个快捷方式
ITEM(new Func() {
@Override public exec(Integer i, String somethingElse) {
StaticMethodClass.IDK(i, somethingElse);
}
});
Run Code Online (Sandbox Code Playgroud)
所以方法引用是快捷方式的快捷方式.