为什么Java8中的函数接口只有一个抽象方法?

为什么Java8中的函数接口只有一个抽象方法?,java,java-8,functional-interface,Java,Java 8,Functional Interface,正如我们在Java8中所知道的,引入了函数接口的概念。一个功能接口有一个抽象方法,可以有几个默认或静态方法 但是为什么函数接口只有一个抽象方法呢? 若接口有不止一个抽象方法,为什么这不是一个函数接口 功能接口也称为单一抽象方法接口,用于简化Lambda函数。由于lambda函数只能为1个方法提供实现,因此函数接口必须只有一个抽象方法。更多细节 编辑->这里还值得注意的是,功能接口可以在接口中有一个默认实现。您将在上面的链接中找到更多关于实现的详细信息。Functional Interface允许

正如我们在Java8中所知道的,引入了函数接口的概念。一个功能接口有一个
抽象
方法,可以有几个默认或静态方法

但是为什么函数接口只有一个抽象方法呢?
若接口有不止一个抽象方法,为什么这不是一个函数接口

功能接口也称为单一抽象方法接口,用于简化Lambda函数。由于lambda函数只能为1个方法提供实现,因此函数接口必须只有一个抽象方法。更多细节


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

Functional Interface允许我们像调用函数一样调用对象,它允许我们在程序中传递动词(函数),而不是名词(对象)。函数接口的实现执行单个定义良好的操作,就像任何方法应该执行的那样,其名称类似于run、execute、perform、apply或其他一些通用动词。[1]

  • Scala和Clojure中的函数编程模式

  • 如果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);
    
        }
    }
    

    由于未实现显示(intx,inty),因此将给出错误。这就是为什么函数接口是一个单一的抽象方法接口。

    Nice link,我也喜欢这个:实际上,只有一个抽象方法是允许的规则有一个例外-如果函数接口由java.lang.Object实现,那么它可以有另一个抽象方法,例如toString().请注意:每个只有一个抽象方法的接口都可以被视为功能接口,因此可以作为一个接口使用。注释只是给程序员的一个提示,这个接口实际上是打算用作功能接口的。因此,您可能希望设计一个当前只有一个方法的接口,但您计划在将来扩展它。那么它就不应该被声明为功能接口。否则,将此接口用于lambda表达式的程序将不再与新版本的接口兼容。@Zabuza,这确实解释了一切。遗憾的是,这不是答案首先,如果您编写这个
    @functional接口MyInterface{void display();void display(int x,int y);}
    @CommonMan,编译器将给出一个错误,这就是我的答案-为什么Java不允许它。而且,我觉得上面的答案不够解释。这就是为什么我只发布了它。看到Adityakryal给出的答案了吗,你有没有给它添加新的内容?@sn.anurag我仍然无法理解这一点。当我有不同的方法签名时,为什么编译器不能区分()->和(x,y)->@rakeshkashyap编译器可以区分,但您应该在实例中为这两个方法提供实现。而且,你不能这样做。例如,您最多可以使用lambda表达式为一个方法提供实现。