“的精确定义;功能接口“;在Java8中
最近,我开始研究Java8,但我不太理解“函数接口”的概念,这是Java实现lambda表达式所必需的。Java中有很多lambda函数,但我还是被卡住了。定义如下: 更准确地说,函数接口被定义为只有一个抽象方法的任何接口 然后,他继续进行示例,其中一个是“的精确定义;功能接口“;在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)->
比较器
接口:
公共接口比较器{
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); }
- 这将生成一个错误:
在接口FunctionInterf中找到多个非重写抽象方法@FunctionalInterface public interface FunctionalInterf { void m(); boolean equals(); }
java.lang.Object
的一个公共方法,则该方法也不计入接口的抽象方法计数,因为接口的任何实现都将有一个来自java.lang.Object
或其他地方的实现。
您可以使用@functional interface
测试哪个接口是正确的功能接口
例如:
- 这很有效
@FunctionalInterface public interface FunctionalInterf { void m(); boolean equals(Object o); }