在函数接口eg- toString,equals中继承对象类方法有什么用?

时间:2018-06-05 08:31:21

标签: object inheritance java-8 functional-interface

我找到了以下代码,什么是继承的equals()和toString()方法。

Exp2

2 个答案:

答案 0 :(得分:3)

(重新)宣布这种方法的主要原因是扩展和记录合同。在Comparator.equals(…)的情况下,它并不那么明显,因为它没有指定那么多新闻。它说

  

此方法必须遵守Object.equals(Object)的一般合同。此外,如果指定的对象也是比较器,并且它与此比较器施加相同的顺序,则此方法只能返回true 。因此,comp1.equals(comp2)表示每个对象引用sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))o1 o2

无论如何,大多数人都会假设。更糟糕的是,如果不是强制执行此合同的最佳方式,那么不能覆盖equals就好了,特别是因为JRE类从不考虑比较器的平等。

要获得更好的覆盖方法示例,请考虑

List.equals(Object)
  

当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都是equal。 (如果e1,则两个元素e2Objects.equals(e1, e2)相等。)

     

...

List.hashCode()
  

返回此列表的哈希码值。列表的哈希码被定义为以下计算的结果:

int hashCode = 1;
for (E e : list)
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
     

根据list1.equals(list2)的一般合同的要求,这可确保list1.hashCode()==list2.hashCode()隐含任意两个列表list1list2 Object.hashCode()

这提供了一项扩展合同,只需使用从equals(Object)继承的hashCode()java.lang.Object方法即可完成。不幸的是,接口不能强制执行其实现类来覆盖这些方法,但这不应该阻止它声明它来记录合同。

当然,拥有这样的合同与将接口用作功能接口的意图不兼容,因为lambda表达式和方法引用不能覆盖从java.lang.Object继承的方法提供更具体的实施。

但是,Java 2中引入了java.util.Comparator,早在Java 8之前,它引入了功能接口的概念。如上所述,它的特殊之处在于我们仍然可以使用Comparator作为功能接口,因为从equals继承的java.lang.Object实现对于为java.util.Comparator.equals指定的合同是合适的。

因此,在设计旨在用作功能接口的新接口时,不应声明与java.lang.Object匹配的方法。

答案 1 :(得分:1)

我认为没有任何意义,因为你无法真正覆盖它们。例如,您可以覆盖default方法以成为abstract

interface First {
    public default void go() {

    }
}

interface Second extends First {
    @Override
    public void go();
}

任何实施Second的班级都将被迫实施go,除非它当然也是abstract

看起来有人考虑强迫FunInterface的每个实现者也实施hashCode/equals - 但这也不会有效。