当前位置: 首页 > 知识库问答 >
问题:

FunctionInterface Comparator有2种抽象方法

狄玉书
2023-03-14

学习Java8个Lambda,只是想知道编译器如何知道比较器中的哪个方法用于lambda表达式?它似乎不是SAM接口?它有两个抽象方法:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

共有3个答案

澹台镜
2023-03-14

所有类都从Object类派生而来,Object包含一个相等的方法<所以,这意味着实现Comparator的每个实例都已经有了equal方法的实现<因此,比较器接口的植入类只需要重写一个方法<这使得比较器接口中只有一个抽象方法

这就是为什么比较器是一个功能接口

步兴德
2023-03-14

equals()是从对象继承的,在确定接口是否为函数接口时,继承的公共方法不计算在内。所以,即使equals()在Comparator中是抽象的,因为它是继承的,所以它不起作用。

规则:函数接口是具有一个抽象方法的接口。默认方法不计算在内;静态方法不算数;并且从对象继承的方法不计算在内。

杭胜
2023-03-14

equals()不是一个抽象的方法。这个方法覆盖了Object.equals(Object),并且只有比较器接口才能将javadoc附加到方法上,解释比较器应该如何实现equals()

参见FunctionInterface的javadoc:

如果接口声明了一个抽象方法,该方法重写了java的一个公共方法。对象,这也不计入接口的抽象方法计数,因为接口的任何实现都将具有来自java的实现。lang.对象或其他位置。

 类似资料:
  • 问题内容: 学习Java 8 Lambda,只是想知道编译器如何知道Comparator中的哪种方法用于lambda表达式?它似乎不是SAM接口?它有2种抽象方法: 问题答案: 不是抽象方法。此方法重写,并且仅使Comparator接口能够将javadoc附加到该方法,解释了比较器应如何实现。 参见FunctionalInterface的javadoc: 如果接口声明的抽象方法覆盖了java.la

  • 本文向大家介绍抽象类必须要有抽象方法吗?相关面试题,主要包含被问及抽象类必须要有抽象方法吗?时的应答技巧和注意事项,需要的朋友参考一下 不需要,抽象类不一定非要有抽象方法;但是包含一个抽象方法的类一定是抽象类。 示例代码: 上面代码,抽象类并没有抽象方法但完全可以正常运行。

  • 2. 数据抽象 现在我们来实现一个完整的复数运算程序。在上一节我们已经定义了复数的结构体类型,现在需要围绕它定义一些函数。复数可以用直角座标或极座标表示,直角座标做加减法比较方便,极座标做乘除法比较方便。如果我们定义的复数结构体是直角座标的,那么应该提供极座标的转换函数,以便在需要的时候可以方便地取它的模和辐角: #include <math.h> struct complex_struct {

  • 问题内容: 是否可以在不添加抽象方法的情况下定义抽象类? 问题答案: 当然。 声明一个类抽象仅意味着您不允许自己对其进行实例化。 声明方法抽象意味着子类必须提供该方法的实现。 这两个是单独的概念,尽管很明显,您不能在非抽象类中使用抽象方法。您甚至可以使用带有方法的抽象类,但绝不能相反。

  • 问题内容: 可以有一个 实现所有方法 的抽象类-里面没有抽象方法。 例如。: 与拥有与具体类相同的类相比,拥有这样的抽象类(如果有)有什么优势? 我能想到的是,当我将其声明为抽象时,它将不会被实例化。但是,我可以通过将其具体化并将其构造函数设为私有来达到相同的效果。 TIA。 // ================== 编辑:我能想到的另一种用途: 它可能会扩展另一个抽象类或实现一个接口,而不实现

  • 在一个具有(控制器-服务-DAO-实体层)的spring hibernate Java项目中,我使用了抽象工厂模式(抽象类有2个抽象方法)。在实现的抽象工厂模式类中,我有dao方法(运行命名查询)。现在,当请求到达来自另一个服务类的dao的服务impl时,它给出了空指针删除,我已经在服务impl中自动连线了dao类` 我不能将@Service(“AbstractFruitService”)添加到S