Java8能否动态实现接口以供方法参考?
我学习了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(); } 如果需要参数,它可能是一个函数,而
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());