奇怪的构造,java转换静态方法到类

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接口的类.相反,它传递了一个方法,它以某种方式隐式转换.

我的问题是这是如何工作的,以及这里适用的规则.

das*_*ght 7

这是一个相对较新的构造,称为方法引用.它直到Java 8才可用.

我不能以Action.ITEM构造的方式绕过它,因为它应该得到一个实现Func接口的类.

方法引用提供了创建此类实现的快捷方式:而不是您编写

ITEM((i, e) -> StaticMethodClass.IDK(i, e));
Run Code Online (Sandbox Code Playgroud)

编译器计算它为你通过"捷径"的语法,只要签名IDK方法是签名完全匹配Funcexec方法.

注意:上面的Lambda版本本身就是一个快捷方式

ITEM(new Func() {
    @Override public exec(Integer i, String somethingElse) { 
        StaticMethodClass.IDK(i, somethingElse);
    }
});
Run Code Online (Sandbox Code Playgroud)

所以方法引用是快捷方式的快捷方式.