开发者社区> 问答> 正文

java Comparator为何是函数式接口? 报错

"

@FunctionalInterface public interface Comparator<T> { /** * Compares its two arguments for order.  Returns a negative integer, * zero, or a positive integer as the first argument is less than, equal * to, or greater than the second.<p> * * In the foregoing description, the notation * <tt>sgn(</tt><i>expression</i><tt>)</tt> designates the mathematical * <i>signum</i> function, which is defined to return one of <tt>-1</tt>, * <tt>0</tt>, or <tt>1</tt> according to whether the value of * <i>expression</i> is negative, zero or positive.<p> * * The implementor must ensure that <tt>sgn(compare(x, y)) == * -sgn(compare(y, x))</tt> for all <tt>x</tt> and <tt>y</tt>.  (This * implies that <tt>compare(x, y)</tt> must throw an exception if and only * if <tt>compare(y, x)</tt> throws an exception.)<p> * * The implementor must also ensure that the relation is transitive: * <tt>((compare(x, y)>0) && (compare(y, z)>0))</tt> implies * <tt>compare(x, z)>0</tt>.<p> * * Finally, the implementor must ensure that <tt>compare(x, y)==0</tt> * implies that <tt>sgn(compare(x, z))==sgn(compare(y, z))</tt> for all * <tt>z</tt>.<p> * * It is generally the case, but <i>not</i> strictly required that * <tt>(compare(x, y)==0) == (x.equals(y))</tt>.  Generally speaking, * any comparator that violates this condition should clearly indicate * this fact.  The recommended language is "Note: this comparator * imposes orderings that are inconsistent with equals." * * @param o1 the first object to be compared. * @param o2 the second object to be compared. * @return a negative integer, zero, or a positive integer as the *         first argument is less than, equal to, or greater than the *         second. * @throws NullPointerException if an argument is null and this *         comparator does not permit null arguments * @throws ClassCastException if the arguments' types prevent them from *         being compared by this comparator. */ int compare(T o1, T o2);

/**
 * Indicates whether some other object is &quot;equal to&quot; this
 * comparator.  This method must obey the general contract of
 * {@link Object#equals(Object)}.  Additionally, this method can return
 * <tt>true</tt> <i>only</i> if the specified object is also a comparator
 * and it imposes the same ordering as this comparator.  Thus,
 * <code>comp1.equals(comp2)</code> implies that <tt>sgn(comp1.compare(o1,
 * o2))==sgn(comp2.compare(o1, o2))</tt> for every object reference
 * <tt>o1</tt> and <tt>o2</tt>.<p>
 *
 * Note that it is <i>always</i> safe <i>not</i> to override
 * <tt>Object.equals(Object)</tt>.  However, overriding this method may,
 * in some cases, improve performance by allowing programs to determine
 * that two distinct comparators impose the same order.
 *
 * @param   obj   the reference object with which to compare.
 * @return  <code>true</code> only if the specified object is also
 *          a comparator and it imposes the same ordering as this
 *          comparator.
 * @see Object#equals(Object)
 * @see Object#hashCode()
 */
boolean equals(Object obj);</code></pre> 

接口中明明有两个抽象方法,int compare(T o1, T o2);boolean equals(Object obj);为何还是函数式接口???

" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/994984aeff8d46b78d489f128f123fa3.png)

展开
收起
因为相信,所以看见。 2020-05-25 15:57:53 804 0
1 条回答
写回答
取消 提交回答
  • 阿里,我所有的向往

    "

    public @interface FunctionalInterface 官方文档:

    If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count  since any implementation of the interface will have an implementation from  java.lang.Object or elsewhere.

    如果接口声明了一个覆盖java.lang.Object的全局方法之一的抽象方法,那么它不会计入接口的抽象方法数量中,因为接口的任何实现都将具有java.lang.Object或其他地方的实现。

    ######

    何为函数式接口?

    在注解@FuctionalInterface的javadoc中如下说明:

    An informative annotation type used to indicate that an interface type declaration is intended
     to be a functional interfaceas defined by the Java Language Specification. 
    Conceptually, a functional interface has exactly one abstract method. 
    Since default methods have an implementation, they are not abstract. 
    If an interface declares an abstract method overriding one of the public methods ofjava.lang.Object, 
    that also does not count toward the interface's abstract method count since any implementation of the interface
    will have an implementation fromjava.lang.Objector elsewhere.

    从中我们可以得知函数式接口的几点特征:

    • 函数式接口只有一个抽象方法
    • default方法某默认实现,不属于抽象方法
    • 接口重写了Object的公共方法也不算入内

    所以,Comparator虽然有两个抽象方法:

    • int compare(T o1, T o2);
    • boolean equals(Object obj);

    其中 equals为Object的方法,不算入内,所以Comparator可以作为函数式接口。

    参考:FunctionalInterface

    ######

    This method must obey the general contract of {@link Object#equals(Object)}.

    " ![image.png](https://ucc.alicdn.com/pic/developer-ecology/3b13a1dd836149fab15d8b7883f34337.png)
    2020-05-25 22:54:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载