是否可以要求实现接口来覆盖Object
方法?
例如,如果我有一个通常用作HashMap
s 中的键的接口,我可能希望要求该接口的所有实现都覆盖hashCode()
andequals()
方法。
但是,如果我有以下界面......:
public interface MyInterface(){
@Override
public int hashCode();
@Override
public boolean equals(Object o);
}
...以下实现编译:
public class MyImplementation(){
}
它不需要覆盖hashCode()
或的方法equals()
,因为它从 继承这些方法Object
。
一种方法可能是切换到使用抽象类而不是接口:
public abstract class MyAbstractClass(){
@Override
public abstract int hashCode();
@Override
public abstract boolean equals(Object o);
}
然后任何扩展这个抽象类的类都需要重写hashCode()
and equals()
:
// doesn't compile - requires implementation of hashCode() and equals()
public class MyClass extends MyAbstractClass {
}
// does compile
public class MyClass extends MyAbstractClass {
@Override
public int hashCode(){
// calculate hashcode
}
@Override
public boolean equals(Object o){
// check equality
}
}
我的假设是,它们之间的区别在于抽象类是一个Object
,所以它Object
在层次结构中低于,所以所有扩展都需要满足抽象类中的合同。然而,接口不是Object
s,所以不要坐在层次结构中,但是接口的任何实现都必须是Object
,此时它继承了Object
方法,因此满足接口“契约”。
但是,回到我最初的问题......有没有办法要求接口的实现来覆盖Object
方法?