【问题标题】:Odd construction, java converting static method to class奇怪的构造,java将静态方法转换为类
【发布时间】:2025-12-12 04:30:02
【问题描述】:

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

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

【问题讨论】:

  • 你应该阅读方法参考。
  • StaticMethodClass::IDK 是对函数的引用,该函数具有与Func.exec() 方法相同的参数和相同的返回类型,因此这是使用现有方法实现接口的一种简短形式

标签: java oop interface static-methods


【解决方案1】:

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

我无法理解Action.ITEM 的构造方式,因为它应该得到一个实现Func 接口的类。

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

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

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

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

的快捷方式
ITEM(new Func() {
    @Override public exec(Integer i, String somethingElse) { 
        StaticMethodClass.IDK(i, somethingElse);
    }
});

所以方法引用是捷径的捷径。

【讨论】:

  • 我想给出一个看起来很像这个的答案。但不幸的是,您涵盖了所有相关方面......除了支持之外什么都没有。
  • 即使您的 lambda“长版”也是 new Func() { @Override public exec(Integer i, String somethingElse) { StaticMethodClass.IDK(i, somethingElse); } }; 的 java 8 快捷方式。我认为您的回答应该包括这一点,以便详尽无遗。
  • @JeremyGrand 非常感谢您的评论!