为什么Java 8中的功能接口有一个抽象方法?

时间:2014-04-28 13:31:11

标签: java java-8 functional-interface

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

但为什么Functional接口只有一个抽象方法呢? 如果Interface有多个抽象方法,为什么这不是一个功能接口?

5 个答案:

答案 0 :(得分:21)

为了便于Lambda功能,引入了功能界面,也称为单一抽象方法界面。由于lambda函数只能提供1方法的实现,因此功能接口必须只有一个抽象方法。有关详情refer here

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

答案 1 :(得分:3)

功能接口允许我们将对象称为一个函数,它允许我们在程序周围传递动词(函数)而不是名词(对象)。功能接口的实现执行单个明确定义的操作,因为任何方法都应该使用诸如运行,执行,执行,应用或其他一般动词之类的名称。[1]

  1. Scala和Clojure中的函数式编程模式。

答案 2 :(得分:1)

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

如果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),它将给出错误。这就是功能接口是单个抽象方法接口的原因。

答案 3 :(得分:0)

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

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

Ex2:-

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

答案 4 :(得分:-3)

编写Lamba表达式意味着我们正在实现作为功能接口的接口。它应该有一个抽象方法,因为在lambda表达式时,我们一次只能提供一个实现。 因此,在下面问题中发布的代码片段中,我们在任何时候只提供一个实现,同时声明Lambda,我们必须实现两个抽象方法。

Why not multiple abstract methods in Functional Interface in Java8?