Java 8 能否动态实现接口以供方法参考?

我学习了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();
}

此代码编译成功,但我不知道它是如何工作的。

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

供应商界面看起来非常简单:

@FunctionalInterface
public interface Supplier<T> {    
    T get();
}

答案 1

供应商界面具有单一(功能性)方法,该方法:

  • 不采用任何参数;
  • 返回一个对象。

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

在这里,所讨论的方法是方法参考。它不带任何参数,并返回 一个新的实例 。你可以把它重写为:Test

method(() -> new Test());

Test::new在这个lambda表达式的句法糖中。


答案 2

Test::new是方法引用。与其添加新的解释,不如看看教程中的方法参考,因为它很好地解释了它们。

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

方法参考有四种风格:查看教程以了解所有内容。


推荐