Java 8可以动态实现接口以供方法参考吗?

gst*_*low 19 java java-8 method-reference constructor-reference

我学习了Java 8的新功能.

我正在玩不同的例子,我发现了一个奇怪的行为:

public static void main(String[] args) {       
    method(Test::new);
}
static class Test{
}

private static void method(Supplier<Test> testSupplier){
    Test test = testSupplier.get();
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译成功,但我不知道它是如何工作的.

为什么可以Test::new接受供应商?

供应商界面看起来很简单:

@FunctionalInterface
public interface Supplier<T> {    
    T get();
}
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 19

Supplier接口具有单一(功能)方法:

  • 不带任何参数;
  • 返回一个对象.

因此,任何符合这两点的方法,都符合功能契约Supplier(因为方法会有相同的签名).

这里,所讨论的方法是方法参考.它不需要参数并返回一个新的实例Test.您可以将其重写为:

method(() -> new Test());
Run Code Online (Sandbox Code Playgroud)

Test::new 在这个lambda表达式的语法糖中.


spr*_*ter 11

Test::new是方法参考.不是添加新的解释,而是值得一看方法参考教程,因为它很好地解释了它们.

您的问题的直接答案Supplier是功能界面 - 这意味着它有一个非默认方法.构造函数Test具有完全相同的签名(无参数,返回Test),因此可以直接引用以创建匿名Supplier.

有四种方法参考:查看教程以了解所有方法.