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

时间:2015-09-21 20:25:59

标签: java java-8 method-reference constructor-reference

我学习了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

3 个答案:

答案 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