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

Java8能否动态实现接口以供方法参考?,java,java-8,method-reference,constructor-reference,Java,Java 8,Method Reference,Constructor Reference,我学习了Java8的新特性 我在玩不同的例子,我发现了一种奇怪的行为: public static void main(String[] args) { method(Test::new); } static class Test{ } private static void method(Supplier<Test> testSupplier){ Test test = testSupplier.get(); } 如果需要参数,它可能是一个函数,而

我学习了Java8的新特性

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

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

private static void method(Supplier<Test> testSupplier){
    Test test = testSupplier.get();
}

如果需要参数,它可能是一个
函数
,而不是供应商。但是方法引用引用构造函数的方式与引用方法的方式相同;他们只是有一个有趣的名字(
new

从中,有四种方法参考:

Kind Example ------------------------------- ------------------------------------ Reference to a static method ContainingClass::staticMethodName Reference to an instance method containingObject::instanceMethodName of a particular object Reference to an instance method ContainingType::methodName of an arbitrary object of a particular type Reference to a constructor ClassName::new 榜样 ------------------------------- ------------------------------------ 对包含Class::staticMethodName的静态方法的引用 对包含Object::instanceMethodName的实例方法的引用 特定对象的 对包含类型::方法名的实例方法的引用 指一个物体的任意部分 特定类型 对构造函数类名的引用::new 该接口有一个单一(功能)方法:

  • 不接受任何参数
  • 返回一个对象
因此,任何符合这两点的方法都符合供应商的功能合同(因为这些方法将具有相同的签名)

这里讨论的方法是方法参考。它不接受任何参数,并返回
Test
的新实例。您可以将其改写为:

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

Test::new
是此lambda表达式的语法糖。

Test::new
是方法参考。与其添加新的解释,不如看一下教程,因为它对它们的解释非常好

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


有四种风格的方法引用:查看教程以了解它们。

要动态实现哪种情况,请注意,对于
类测试
,一个“空”类声明隐含着一个无参数构造函数。这就是为什么您可以编写
new Test()
并让它工作的原因,任何对该构造函数的lambda或方法引用工作的原因。@Sotirios Delimanolis可能对链接问题的第一个注释更相关,因此此功能允许旧类可以实现新创建的接口。哇@是的,没错。只要签名匹配,就可以引用该方法来创建接口的实例。如果使用得当,它可以大大提高代码的可读性。因此,如果回答我的主题的问题-是的,方法参考是为动态接口实现而发明的。
method(() -> new Test());