java 8 中的功能接口如何工作

How the functional interface working in java 8

这是我 运行 在研究功能接口概念时遇到的一个例子。

interface Sayable{  
   void say();  
}  
public class MethodReference {  
    public static void saySomething(){  
        System.out.println("Hello, this is static method.");  
    }  
    public static void main(String[] args) {  
        // Referring static method  
        Sayable sayable = MethodReference::saySomething;  
        // Calling interface method  
        sayable.say();  
    }  
} 

它在运行时在输出中打印 "Hello, this is static method."。我的问题是当我们调用 say() 方法(未实现)时如何打印输出

你可以这样想方法引用:

Sayable sayable = new Sayable() {

    @Override
    void say() {
        // Grab the body of the method referenced by the method reference,
        // which is the following:
        System.out.println("Hello, this is static method.");
    }
}

方法参考有效,因为

  • 目标类型是功能接口 Sayable(您试图将结果存储到Sayable类型);和
  • saySomething()的方法引用的签名匹配功能接口方法say(),即参数 return类型匹配1.

Sayable实例的say()方法的实现引用变量sayable等于方法体方法引用指的是.

就像 JB Nizet 在评论中所说的那样,say() 实际上 实施的。


1 一点细节:单词 'match' 并不完全意味着 'are equal'。例如。如果 saySomething() return 编辑了 int,它仍然有效,尽管目标类型的唯一方法将 return 类型定义为 void.

基本上只有一个抽象方法的接口是函数式接口。

如果你想匿名创建接口对象,调用MethodReference的saySomething()。在正常情况下它会是这样的..

Sayable sayable = new Sayable() {
  @Override
    void say() {
       MethodReference::saySomething;  
    }
}

在函数式接口的情况下,因为总是只有一种方法。您可以忽略 say() 和相关的大括号 - 这是由 lambdas 提供的。

所以你可以说.

Sayable sayable = MethodReference::saySomething;  

这仅适用于功能接口。不适用于具有多个抽象方法的接口。