Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的精确定义;功能接口“;在Java8中_Java_Lambda_Java 8_Abstract_Functional Interface - Fatal编程技术网

“的精确定义;功能接口“;在Java8中

“的精确定义;功能接口“;在Java8中,java,lambda,java-8,abstract,functional-interface,Java,Lambda,Java 8,Abstract,Functional Interface,最近,我开始研究Java8,但我不太理解“函数接口”的概念,这是Java实现lambda表达式所必需的。Java中有很多lambda函数,但我还是被卡住了。定义如下: 更准确地说,函数接口被定义为只有一个抽象方法的任何接口 然后,他继续进行示例,其中一个是比较器接口: 公共接口比较器{ int比较(to1,to2); 布尔等于(对象obj); } 我能够测试我是否可以使用lambda函数代替Comparator参数,并且它可以工作(即Collections.sort(list,(a,b)->

最近,我开始研究Java8,但我不太理解“函数接口”的概念,这是Java实现lambda表达式所必需的。Java中有很多lambda函数,但我还是被卡住了。定义如下:

更准确地说,函数接口被定义为只有一个抽象方法的任何接口

然后,他继续进行示例,其中一个是
比较器
接口:

公共接口比较器{
int比较(to1,to2);
布尔等于(对象obj);
} 
我能够测试我是否可以使用lambda函数代替Comparator参数,并且它可以工作(即
Collections.sort(list,(a,b)->a-b)

但是在比较器接口中,
compare
equals
方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义要求一个接口只有一个抽象方法,那么这是如何工作的呢?我在这里遗漏了什么?

Java文档说:

请注意,不重写Object.equals(Object)总是安全的。 但是,在某些情况下,重写此方法可能会提高性能 通过允许程序确定两个不同的 比较器施加相同的顺序

也许比较仪是特别的?也许,即使它是一个接口,也有一个默认的
equals()
实现调用
compare()
?从算法上讲,这是微不足道的

我认为接口中声明的所有方法都是抽象的(即没有默认实现)。但也许我遗漏了什么。

Java文档说:

请注意,不重写Object.equals(Object)总是安全的。 但是,在某些情况下,重写此方法可能会提高性能 通过允许程序确定两个不同的 比较器施加相同的顺序

也许比较仪是特别的?也许,即使它是一个接口,也有一个默认的
equals()
实现调用
compare()
?从算法上讲,这是微不足道的

我认为接口中声明的所有方法都是抽象的(即没有默认实现)。但也许我遗漏了什么。

来自:

接口比较器是功能性的,因为尽管它声明了两个抽象方法,但其中一个方法具有与对象中的公共方法相对应的签名。接口总是声明与对象的公共方法相对应的抽象方法,但它们通常隐式地这样做。无论是隐式声明还是显式声明,此类方法都将从计数中排除

我真的说得再好不过了。

来自:

接口比较器是功能性的,因为尽管它声明了两个抽象方法,但其中一个方法具有与对象中的公共方法相对应的签名。接口总是声明与对象的公共方法相对应的抽象方法,但它们通常隐式地这样做。无论是隐式声明还是显式声明,此类方法都将从计数中排除


我不能说得更好。

Q。但是在Comparator接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义要求一个接口只有一个抽象方法,那么这是如何工作的呢?我错过了什么

A

函数接口可以指定由对象定义的任何公共方法,例如equals(), 不影响其“功能接口”状态。公共对象方法被认为是隐式的 功能接口的成员,因为它们由 功能接口

@FunctionalInterface
    public interface MyFuctionalInterface 
    {
    public void perform();
 
    @Override
    public String toString();                //Overridden from Object class
 
    @Override
    public boolean equals(Object obj);        //Overridden from Object class
    }

但是在Comparator接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义要求一个接口只有一个抽象方法,那么这是如何工作的呢?我错过了什么

A

函数接口可以指定由对象定义的任何公共方法,例如equals(), 不影响其“功能接口”状态。公共对象方法被认为是隐式的 功能接口的成员,因为它们由 功能接口

@FunctionalInterface
    public interface MyFuctionalInterface 
    {
    public void perform();
 
    @Override
    public String toString();                //Overridden from Object class
 
    @Override
    public boolean equals(Object obj);        //Overridden from Object class
    }

下表给出了另一种解释:

从概念上讲,函数接口只有一个抽象方法。因为默认方法有一个实现,所以它们不是抽象的如果接口声明了一个抽象方法,该方法覆盖了
java.lang.Object
的一个公共方法,则该方法也不计入接口的抽象方法计数,因为接口的任何实现都将有一个来自
java.lang.Object
或其他地方的实现。

您可以使用
@functional interface
测试哪个接口是正确的功能接口

例如:

  • 这很有效

    @FunctionalInterface
    public interface FunctionalInterf {
    
        void m();
    
        boolean equals(Object o);
    
    }
    
  • 这将生成一个错误:

    @FunctionalInterface
    public interface FunctionalInterf {
    
        void m();
    
        boolean equals();
    
    }
    
    在接口FunctionInterf中找到多个非重写抽象方法


另一种解释见:

从概念上讲,函数接口只有一个抽象方法。因为默认方法有一个实现,所以它们不是抽象的如果接口声明了一个抽象方法,该方法覆盖了
java.lang.Object
的一个公共方法,则该方法也不计入接口的抽象方法计数,因为接口的任何实现都将有一个来自
java.lang.Object
或其他地方的实现。

您可以使用
@functional interface
测试哪个接口是正确的功能接口

例如: