Comparator <T>如何实现功能接口?

问题描述

根据功能接口的定义-功能接口是仅包含一种抽象方法的接口。

但是Comparator<T>有两种抽象方法:

int compare(T o1,T o2);

boolean equals(Object obj);

其他是默认值和静态值。

JavaDocs将其称为功能接口。怎么会呢?

解决方法

您读错了定义,或者至少是一个(过度)简化的定义。

FunctionalInterface的正确定义是:

功能接口是仅具有一个抽象方法(除Object的方法之外)的接口,因此表示单个功能协定。这种“单一”方法可以采取多种抽象方法的形式,这些抽象方法具有从超级接口继承的等效等效签名。在这种情况下,继承的方法在逻辑上表示单个方法。

来源:Java Language Specification section 9.8

,

如果您查看Comparator<T>的源代码,则如下所示:

@FunctionalInterface
public interface Comparator<T> {

  // abstract method
  int compare(T o1,T o2);

  // abstract method,overriding public methods of `java.lang.Object`,so it does not count
  boolean equals(Object obj);

}

equals是覆盖java.lang.Object的公共方法之一的抽象方法,这不算作抽象方法。

因此,实际上,比较器只有一种抽象方法,即int compare(T o1,T o2),它符合功能接口的定义。

,

equals仅明确包含在Comparator界面中,以便他们可以向其中添加一些其他JavaDoc,例如比较器的一些特定要求:

仅当指定对象也是一个比较器并且施加与该比较器相同的顺序时,此方法才能返回true。

来源:Comparator JavaDocs

The JLS说:

接口不继承自Object,而是隐式声明 与对象(§9.2)相同的许多方法

所有Comparator作者所做的都是明确声明通常是隐式的内容。

如果出于定义功能接口的目的将Object的方法视为抽象方法,则功能接口将只有一个抽象方法。因此,不考虑它们:

功能接口是只有一个抽象的接口 方法(除了对象的方法之外)

JLS,重点是我的

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...