我找到了以下代码,什么是继承的equals()和toString()方法。
Exp2
答案 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
,则两个元素e2
和Objects.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()
隐含任意两个列表list1
和list2
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
- 但这也不会有效。