这个静态方法是如何代替实现接口的 class 传递的?

How is this static method being passed in lieu of a class that implements an interface?

我不确定这里发生了什么。这是一个界面:

public interface AppInit {
  void create(Environment var1);
}

这里有一些class的方法:

  public static StandaloneModule create(AppInit appInit) {
    return new StandaloneModule(appInit);
  }

下面是该方法的调用方式:

StandaloneModule.create(Main::configure)

但是那个参数方法的签名是:

static void configure(final Environment environment) {
  ...

为什么编译?

你的接口是一个函数式接口(即一个抽象方法)。特别是它是 Environment 类型的 Consumer。消费者接受一个论点,returns 什么也没有。所以它只是 consumes 参数,通常对其应用某种类型。这是一个更常见的例子。

interface Consumer {
      void apply(String arg);
}

public class ConsumerDemo  {
    public static void main(String [] args) {
        SomeMethod(System.out::println);
        
    }
    
    public static void SomeMethod(Consumer con) {
        con.apply("Hello, World!");
    }
}

打印

Hello, World!

接口不需要显式实现。编译器通过找到合适的接口并创建通常是匿名的 class.

来处理这个问题

以上是使用方法引用调用的。它也可以称为 lambda。

a -> System.out.println(a)

这里 con.apply("Hello, World!") 会将字符串传递给 a 并打印出来。