java - Java 8 可以动态实现接口(interface)以供方法引用吗?

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

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

最佳答案

Supplier接口(interface)有一个(功能)方法:

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

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

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

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

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

关于java - Java 8 可以动态实现接口(interface)以供方法引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703977/

相关文章:

java - 如何使用 Java 8 流对按月和年分组的数据进行制表

functional-programming - java 8中构造函数引用的用途是什么

java - 使用 FileReader read() 和 BufferedReader readLine() 对文件的行数和字符进行问题计数

java - 从maven迁移到bazel

Java 字节码、java Supplier 和 invokedynamic 参数

java - void 不是函数式接口(interface)

java - 如何使用 Java 8 中的方法引用连接 String ArrayList 的所有元素

java - Python 运算符模块相当于 Java 中的基本方法引用

java - 使用 jpa 生成实体时显示错误

java - JBoss 5.1 中的异步数据库更新