Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
功能接口在Java8中如何工作_Java_Java 8_Functional Interface - Fatal编程技术网

功能接口在Java8中如何工作

功能接口在Java8中如何工作,java,java-8,functional-interface,Java,Java 8,Functional Interface,这是我在研究功能接口概念时遇到的一个示例 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)

这是我在研究功能接口概念时遇到的一个示例

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();  
    }  
} 

这是在运行时在输出中打印“你好,这是静态方法”。我的问题是,当我们调用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()
    匹配,即参数和返回类型匹配1
被称为变量
Sayable
Sayable
实例的
say()
方法的实现等于方法引用引用的方法体

正如JB Nizet在评论中所说,
say()
实际上已经实现了



1一个小细节:“匹配”一词并不完全意味着“相等”。例如,如果
saySomething()
返回一个
int
,它仍然可以工作,尽管目标类型的唯一方法将返回类型定义为
void
,基本上,只有一个抽象方法的接口是函数接口

如果要匿名创建接口对象并调用MethodReference的saySomething()。通常情况下是这样的

Sayable sayable = new Sayable() {
  @Override
    void say() {
       MethodReference::saySomething;  
    }
}
对于功能接口,因为总是只有一种方法。您可以忽略say()和相关的大括号-这是由lambdas提供的

你可以这么说

Sayable sayable = MethodReference::saySomething;  

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

它已实现
MethodReference::saySomething
是Sayable的一个实例,其
say()
方法由方法
saySomething
实现。我发誓,2014年我第一次看到这张照片时,我有着和你现在一样的感觉;但是,当你在阅读更多的文档时,你已经习惯了它,你只需要接受Java的话就可以了
Sayable
定义为一种类型a函数,它不接受任何参数,也不返回任何值,因为Java这么说。因为这就是
MethodReference::saySomething
的含义,所以可以将其分配给该类型的引用。然后就是你如何处理这样的推荐信。有一个任意的方法名来调用这个函数真的很奇怪。你只需要跟着它走就行了。@JBNizet所有的感谢都将接受给出的答案