Java 8 中的功能接口用于什么?

2022-08-31 06:37:51

我在Java 8中遇到了一个新术语:“功能接口”。在使用lambda表达式时,我只能找到它的一种用法。

Java 8提供了一些内置的功能接口,如果我们想定义任何功能接口,那么我们可以使用注释。它将允许我们在接口中只声明一个方法。@FunctionalInterface

例如:

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

在Java 8中,除了使用lambda表达式之外,它还有多大用处?

这里的问题与我问的问题不同。它问为什么我们在使用lambda表达式时需要函数接口。我的问题是:除了与lambda表达式一起使用之外,功能接口的其他用途是什么?


答案 1

@FunctionalInterface注释对于代码的编译时检查非常有用。除了 之外,不能有多个方法,以及重写您的接口中或任何其他用作功能接口的接口中的方法的抽象方法。staticdefaultObject@FunctionalInterface

但是,您可以使用没有此注释的 lambda,也可以覆盖没有注释的方法。@Override

从文档

一个函数接口只有一个抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果一个接口声明一个抽象方法覆盖了java.lang.Object的公共方法之一,那么这也不会计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object或其他地方的实现。

可以在 lambda 表达式中使用:

public interface Foo {
  public void doSomething();
}

不能在 lambda 表达式中使用:

public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

但这会产生编译错误

@FunctionalInterface
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}

无效的“@FunctionalInterface”注释;Foo 不是一个功能接口


答案 2

文档确实在目的之间有所区别

一种信息性注释类型,用于指示接口类型声明旨在成为 Java 语言规范定义的功能接口

和用例

请注意,可以使用 lambda 表达式、方法引用或构造函数引用创建函数接口的实例。

其措辞不排除其他一般用例。由于主要目的是指示功能接口,因此您的实际问题归结为“除了 lambda 表达式和方法/构造函数引用之外,函数接口还有其他用例吗?

由于函数接口是由 Java 语言规范定义的 Java 语言构造,因此只有该规范才能回答以下问题:

JLS §9.8.功能接口

...

除了通过声明和实例化类来创建接口实例的通常过程 (§15.9) 之外,还可以使用方法引用表达式和 lambda 表达式 (§15.13, §15.27) 创建功能接口的实例。

因此,Java语言规范没有另有说明,该部分中提到的唯一用例是使用方法引用表达式和lambda表达式创建接口实例。(这包括构造函数引用,因为它们在规范中被标记为方法引用表达式的一种形式)。

所以用一句话来说,不,在Java 8中没有其他用例。


推荐