为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2022-11-02 17:05:58
这是我在研究功能接口概念时遇到的一个示例。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() 方法时它是如何打印输出的(未实现)
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

你可以这样想方法引用:


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。

被称为变量say()的实例的方法的实现等于方法引用所引用的方法的主体。Sayablesayable


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

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



查看完整回答
反对 回复 2022-11-02
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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


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


Sayable sayable = new Sayable() {

  @Override

    void say() {

       MethodReference::saySomething;  

    }

}

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


所以你可以说。


Sayable sayable = MethodReference::saySomething;  

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


查看完整回答
反对 回复 2022-11-02
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号