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

时间:2017-06-28 11:06:06

标签: java oop interface static-methods

我最近偶然发现了一段我无法用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接口的类。相反,它传递了一个方法,它以某种方式隐式转换。

我的问题是这是如何运作的,以及适用的规则。

1 个答案:

答案 0 :(得分:7)

这是一个相对较新的构造,称为method reference。直到Java 8才能使用它。

  

我无法以Action.ITEM的构造方式绕过它,因为它应该有一个实现Func接口的类。

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

ITEM((i, e) -> StaticMethodClass.IDK(i, e));

只要IDK方法的签名与Func的{​​{1}}方法的签名完全匹配,编译器就会通过“快捷方式”语法为您计算出来

注意:上面的Lambda版本本身就是

的快捷方式
exec

所以方法参考是快捷方式的快捷方式。