考虑以下人为的“你好,世界”:
abstract public class Main implements java.util.function.Supplier<Runnable> {
public static void main(String[] args) {
new Main() {
private void hello() {
System.out.println("hello, world");
}
@Override
public Runnable get() {
return this::hello;
}
}.get().run();
}
}
这有效。现在,假设我意识到可以制作
hello
方法 static
,我现在如何获取对该方法的引用?静态方法引用需要使用类的名称,但根据定义,类的名称不存在。我尝试只是尝试引用 hello
或 ::hello
或 null::hello
但这些对于编译器来说是不可接受的。
由于该方法是静态的,因此当然可以通过将静态方法放入
Main
类并将其引用为 Main::hello
来轻松解决此问题,但在更复杂的设置中,能够引用的优点是静态方法会将静态方法限制在尽可能小的上下文中。当然,可以说,此时您可能正在滥用匿名类的能力,但我的问题主要来自好奇心,想了解是否可以引用匿名类的静态方法。
虽然方法引用可能不太可能,但另一种解决方法可能是定义 lambda 并调用其中的静态函数。
abstract public class Main implements java.util.function.Supplier<Runnable> {
public static void main(String[] args) {
new Main() {
private static void hello() {
System.out.println("hello, world");
}
@Override
public Runnable get() {
return () -> hello();
}
}.get().run();
}
}
虽然我不确定编译器是否能够意识到额外的间接寻址是不必要的,但我认为这并非不可能。