我学习了Java 8的新功能。
我正在玩不同的例子,我发现了一个奇怪的行为:
yum install gcc-c++ libstdc++-devel
此代码编译成功,但我不知道它是如何工作的。
为什么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
答案 0 :(得分:19)
Supplier
接口有一个(功能)方法:
因此,任何符合这两点的方法都符合Supplier
的功能契约(因为这些方法具有相同的签名)。
这里,所讨论的方法是方法参考。它不需要参数并返回Test
的新实例。您可以将其重写为:
method(() -> new Test());
Test::new
这个lambda表达式的语法糖。
答案 1 :(得分:11)
Test::new
是方法参考。不是添加新的解释,而是值得一看method references的教程,因为它很好地解释了它们。
您问题的直接答案是Supplier
是一个功能界面 - 意味着它有一个非默认方法。 Test
的构造函数具有完全相同的签名(无参数,返回Test
),因此可以直接引用以创建匿名Supplier
。
有四种方法参考:查看教程以了解它们。
答案 2 :(得分:3)
如果需要参数,它可能是Function
,而不是供应商。但是方法引用可以引用构造函数,就像它们引用方法一样;他们只有一个有趣的名字(new
)。
从the Java Tutorial,开始,有四种方法参考:
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