【问题标题】:How the functional interface working in java 8java 8中的功能接口如何工作
【发布时间】:2019-05-01 06:55:26
【问题描述】:

这是我在研究函数式接口概念时遇到的一个示例。

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() 方法时它是如何打印输出的(未实现)

【问题讨论】:

  • 已实现MethodReference::saySomething 是 Sayable 的一个实例,其 say() 方法由 saySomething 方法实现。 docs.oracle.com/javase/tutorial/java/javaOO/…
  • 我发誓我在 2014 年第一次看到这个时,我和你现在有同样的感觉;但是您在阅读文档时习惯了它
  • 您只需要相信 Java 的话。 Sayable 将不带参数且不返回值的函数定义为类型,因为 Java 是这么说的。因为这就是MethodReference::saySomething,所以您可以将其分配给该类型的引用。然后就是你如何处理这样的参考。有一个任意的方法名称来调用该函数真的很奇怪。你只需要接受它。
  • @JBNizet 和所有感谢将接受给定的答案

标签: java java-8 functional-interface


【解决方案1】:

你可以这样想方法引用:

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 .

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

正如 JB Nizet 在 cmets 中所说,say() 实际上实现。


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

【讨论】:

    【解决方案2】:

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

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

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

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

    所以你可以说。

    Sayable sayable = MethodReference::saySomething;  
    

    这仅适用于函数式接口。不适用于具有多个抽象方法的接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      相关资源
      最近更新 更多