Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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
Java 比较器<;T>;功能接口?_Java_Oop_Functional Interface - Fatal编程技术网

Java 比较器<;T>;功能接口?

Java 比较器<;T>;功能接口?,java,oop,functional-interface,Java,Oop,Functional Interface,根据功能接口的定义-功能接口是只包含一个抽象方法的接口。 但是,Comparator有两种抽象方法: int compare(T o1, T o2); boolean equals(Object obj); 其他是默认的和静态的 JavaDocs将其称为功能接口。怎么可能呢?如果您查看比较器的源代码,它如下所示: @FunctionalInterface public interface Comparator<T> { // abstract method int co

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

但是,
Comparator
有两种抽象方法:

int compare(T o1, T o2);

boolean equals(Object obj);
其他是默认的和静态的


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

如果您查看比较器的源代码,它如下所示:

@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);

}
@functioninterface
公共接口比较器{
//抽象方法
int比较(to1,to2);
//抽象方法,重写“java.lang.Object”的公共方法,因此它不计算在内
布尔等于(对象obj);
}
equals
是一个抽象方法,它覆盖了
java.lang.Object
的一个公共方法,这不算作抽象方法


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

您读取了错误的定义,或者至少是(过度)简化的定义

功能界面的正确定义是:

函数接口是只有一个抽象方法(对象方法除外)的接口,因此表示单个函数契约。这种“单一”方法可以采用多个抽象方法的形式,这些方法覆盖从超级接口继承的等效签名;在本例中,继承的方法在逻辑上表示单个方法


来源:

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

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

资料来源:

说:

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

因此,
Comparator
作者所做的就是显式地声明一些通常是隐式的东西

如果
Object
的方法被算作定义功能接口的抽象方法,那么no功能接口将只有一个抽象方法。因此,它们不被视为:

函数接口是只有一个抽象的接口 方法(对象方法除外)


,emphasis mine

那么,是等同于抽象方法还是与默认方法一样?@JasHanChaHal它是一种抽象方法,而不是被视为确定功能接口状态的一部分。更新了我的回答界面上的声明是抽象的,添加默认实现是没有意义的,因为
对象
中的
equals
方法不是抽象的。@Hulk确实是,而且它是被禁止的:“如果默认方法与类对象的非私有方法重写等价,这是一个编译时错误,因为实现接口的任何类都将继承其自己的方法实现”我实际上更喜欢这里给出的答案,不过,也许它们应该合并到dupe?