是否可以要求实现接口来覆盖Object
方法?
例如,如果我有一个通常用作HashMap
s中的键的接口,我可能希望要求该接口的所有实现覆盖hashCode()
和equals()
方法
但是,如果我有以下界面......:
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()
和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
,所以不要坐在层次结构中,但接口的任何实现都必须是Object
,此时它继承Object
方法,并且从而满足界面“契约”。
然而,回到我原来的问题......是否有办法要求实现接口来覆盖Object
方法?
答案 0 :(得分:4)
没有办法只使用接口来完成你想要的东西。
通过强制使用抽象基类来实现此目的的另一种方法(可能更清晰)如下:
public abstract class MyAbstractClass {
@Override public final int hashCode() { return hashCodeImpl(); }
@Override public final boolean equals(Object o) { return equalsImpl(o); }
protected abstract int hashCodeImpl();
protected abstract boolean equalsImpl(Object o);
}
答案 1 :(得分:0)
没有。 Java无法表达这一要求。这样的抽象类怎么样?
public abstract class MyAbstractClass(){
@Override
public int hashCode(){
return myOverrideHashCode();
}
@Override
public boolean equals(){
return myOverrideEquals();
}
protected abstract int myOverrideHashCode();
protected abstract booleans myOverrideEquals();
}