38

正如我们所知,在 Java 8 中,引入了函数式接口的概念。功能接口具有一种abstract方法,并且可以使用多种默认或静态方法。

但是为什么一个函数式接口应该只有一个抽象方法呢?如果接口有不止一个抽象方法,为什么这不是功能接口?

4

4 回答 4

33

引入了也称为单一抽象方法接口的功能接口以方便 Lambda 函数。由于 lambda 函数只能提供 1 个方法的实现,因此功能接口必须只有一个抽象方法。有关更多详细信息,请参阅此处

编辑->这里还值得注意的是,功能接口可以在接口中具有默认实现。您将在上面的链接中找到有关实施的更多详细信息。

于 2014-04-28T13:36:05.033 回答
12

如果 Java 允许有两个抽象方法,则需要 lambda 表达式来提供这两个方法的实现。因为,调用方法不知道从这两个抽象方法中调用哪个方法。它可以调用未实现的那个。例如

如果 Java 允许这种函数式接口

@FunctionalInterface
interface MyInterface {
    void display();
    void display(int x, int y);
}

然后在实施以下将是不可能的。

public class LambdaExpression {
    public static void main(String[] args) {
        MyInterface ref = () -> System.out.print("It is display from sout");
        ref.display(2, 3);

    }
}

由于 display(int x, int y) 没有实现,所以会报错。这就是为什么功能接口是一个单一的抽象方法接口。

于 2019-03-11T05:18:59.503 回答
5

函数式接口让我们可以像调用函数一样调用对象,这让我们可以在程序周围传递动词(函数)而不是名词(对象)。功能接口的实现执行单个定义良好的操作,任何方法都应该使用类似 run、execute、perform、apply 或其他一些通用动词的名称。 [1]

  1. Scala 和 Clojure 中的函数式编程模式。
于 2014-11-14T05:51:53.173 回答
0

如果在一个接口中定义多个抽象方法是可能的。但是如果你在接口顶部定义为@FunctionalInterface,你会得到编译时错误“Invalid '@FunctionalInterface' annotation Interf not a functional interface”。甚至实现也是不可能的,因为编译无法猜测方法的类型推断(不兼容的类型 Interf 不是接口 Interf 中的多个非覆盖抽象方法的功能接口) Ex1:-

@FunctionalInterface
interface Interf {
   public void m1();
   public void m2();
 }//error:-Invalid '@FunctionalInterface' annotation Interf  not a functional interface

例 2:-

interface Interf {
   public void m1();
   public void m2();
}
public class abc1 {
    public static void main(String args[]) {
        interf interf = () -> System.out.println("we impl");
        interf.m1();
    }
}//incompatible types Interf is not a functional interface
multiple non-overriding abstract methods in interface Interf
于 2021-07-11T12:31:45.520 回答