繁体   English   中英

功能界面如何在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();  
    }  
} 

这是打印“你好,这是静态方法”。 输出时运行。 我的问题是当我们调用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() saySomething()匹配,即参数返回类型匹配1

Sayable实例的say()方法的Sayable称为变量sayable等于方法引用引用的方法的主体。

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


1一点点细节:“匹配”这个词并不完全意味着“相等”。 例如,如果saySomething()返回一个int ,它仍然可以工作,尽管目标类型的唯一方法将返回类型定义为void

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

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

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

在功能界面的情况下,因为总是只有一种方法。 你可以忽略say()和相关的括号 - 这是由lambdas提供的。

所以你可以说。

Sayable sayable = MethodReference::saySomething;  

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM